spring学习(五):aop的设计由来之静态代理
2017-05-06 14:33
316 查看
静态代理:
抽象角色:一般使用接口或者抽象类实现。在这里就是rent接口
真实角色:代表干事情的人,也就是被代理的人,他不关注一些公共复杂的事情,在这里就是房东。
代理角色: 代理真实角色的人,代理真实角色后一般会做一些附属操作,在这里就是中介。
(一)先给大家理解下什么事抽象角色,真实角色,代理角色。
理解了这几个名词的含义了,肯定缺不了来一波代码。
(二)在实际程序中的作用
(1)就拿在service层添加日志来举例,我们每执行一个方法都要添加日志,这样service层就添加了和增删改查操作不相关的代码(log),并且我们必须还得重复的添加log方法,这样就违背了我们上面说的不关注一些公共复杂的业务,代码
userService接口
userService实现类
(2)使用静态代理之后的代码
添加静态代理
修改userService实现类,这样userService实现类就只关注他需要关注的事情
好处:使得真实角色要处理的业务很纯粹,不再去关注一些公共复杂的事情,租房就只租房,不用搞其他的,公共的业务由代理完
成,我们知道在dao层有很多事情是公共的,比如增,删,改都要加上事务,还有就是service层需要加日志,这种繁琐重复的事情,
假如每次增,删,改操作我们都要加事务,这样就很麻烦。加上静态代理就能使公共业务扩展变得更加集中。
缺点:增加了代理类,工作流变大了,开发效率太低了,所以就出现了动态代理。
抽象角色:一般使用接口或者抽象类实现。在这里就是rent接口
真实角色:代表干事情的人,也就是被代理的人,他不关注一些公共复杂的事情,在这里就是房东。
代理角色: 代理真实角色的人,代理真实角色后一般会做一些附属操作,在这里就是中介。
(一)先给大家理解下什么事抽象角色,真实角色,代理角色。
1.客户租房,我们首先得找一个中介,中介对应了房东 public class Client { public static void main(String[] args) { Host host = new Host();//房东 Proxy proxy = new Proxy(host);//中介 proxy.rent(); } } 2.租房接口 public interface Rent { public void rent(); } 2.房东实现Rent接口 public class Host implements Rent{ public void rent(){ System.out.println("房屋出租"); } } 3.中介实现Rent接口 public class Proxy implements Rent{ private Host host;//中介要房东授权才能租房,所以要引用房东 public Proxy() { } public Proxy(Host host) { this.host = host; } public void setHost(Host host) { this.host = host; } //租房 public void rent(){ seeHouse(); host.rent(); fare(); } //看房 private void seeHouse(){ System.out.println("带房客看房"); } //收中介费 private void fare(){ System.out.println("收取中介费"); } }
理解了这几个名词的含义了,肯定缺不了来一波代码。
(二)在实际程序中的作用
(1)就拿在service层添加日志来举例,我们每执行一个方法都要添加日志,这样service层就添加了和增删改查操作不相关的代码(log),并且我们必须还得重复的添加log方法,这样就违背了我们上面说的不关注一些公共复杂的业务,代码
userService接口
public interface UserService { public void add(); public void update(); public void delete(); public void search(); }
userService实现类
public class UserServiceImpl implements UserService { @Override public void add() { //公共的业务----日志,安全,权限,缓存,事务等等 //A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi log("add") System.out.println("增加用户"); } @Override public void update() { log("update") System.out.println("修改用户"); } @Override public void delete() { log("delete") System.out.println("删除用户"); } @Override public void search() { log("search") System.out.println("查询用户"); } public void log(String methodName){ System.out.println("执行"+methodName+"方法"); } }
(2)使用静态代理之后的代码
添加静态代理
public class UserServiceProxy implements UserService{ private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } @Override public void add() { log("add"); userService.add(); } @Override public void delete() { //日志,安全,缓存,事务,异常处理等 log("delete"); userService.delete(); } @Override public void search() { log("search"); userService.search(); } public void update() { log("update"); userService.update(); } public void log(String methodName){ System.out.println("执行"+methodName+"方法"); } }
修改userService实现类,这样userService实现类就只关注他需要关注的事情
public class UserServiceImpl implements UserService { @Override public void add() { //公共的业务----日志,安全,权限,缓存,事务等等 //A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi System.out.println("增加用户"); } @Override public void update() { System.out.println("修改用户"); } @Override public void delete() { System.out.println("删除用户"); } @Override public void search() { System.out.println("查询用户"); } }
好处:使得真实角色要处理的业务很纯粹,不再去关注一些公共复杂的事情,租房就只租房,不用搞其他的,公共的业务由代理完
成,我们知道在dao层有很多事情是公共的,比如增,删,改都要加上事务,还有就是service层需要加日志,这种繁琐重复的事情,
假如每次增,删,改操作我们都要加事务,这样就很麻烦。加上静态代理就能使公共业务扩展变得更加集中。
缺点:增加了代理类,工作流变大了,开发效率太低了,所以就出现了动态代理。
相关文章推荐
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring AOP 学习之静态代理
- Spring学习总结——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Java设计模式之静态代理模式 (Spring Aop)
- Spring学习心得(12)-- aop入门前内容:静态代理
- 【spring 3】AOP:静态代理
- Spring2.5学习4.1_静态代理实现
- spring aop学习8:spring对jdk和cglib动态代理的选择
- Spring AOP的实现原理—— 静态代理和动态代理
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- Spring 4.0 学习日记(6) ---静态代理
- Java设计模式学习06——静态代理与动态代理
- Spring AOP 学习(一) 代理模式
- SPRING源码学习之路(三)——<aop:config>自动代理的实现
- Java设计模式学习06——静态代理与动态代理
- Spring AOP代理的学习案例
- Spring核心学习-AOP(7) 织入和代理