spring学习(五):aop的设计由来之静态代理

来源:互联网 发布:微信中打开淘宝网址 编辑:程序博客网 时间:2024/06/05 17:28
静态代理:
抽象角色:一般使用接口或者抽象类实现。在这里就是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 {@Overridepublic void add() {//公共的业务----日志,安全,权限,缓存,事务等等//A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgilog("add")System.out.println("增加用户");}@Overridepublic void update() {log("update")System.out.println("修改用户");}@Overridepublic void delete() {log("delete")System.out.println("删除用户");}@Overridepublic 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;}@Overridepublic void add() {log("add");userService.add();}@Overridepublic void delete() {//日志,安全,缓存,事务,异常处理等log("delete");userService.delete();}@Overridepublic 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 {@Overridepublic void add() {//公共的业务----日志,安全,权限,缓存,事务等等//A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgiSystem.out.println("增加用户");}@Overridepublic void update() {System.out.println("修改用户");}@Overridepublic void delete() {System.out.println("删除用户");}@Overridepublic void search() {System.out.println("查询用户");}}
  

好处:使得真实角色要处理的业务很纯粹,不再去关注一些公共复杂的事情,租房就只租房,不用搞其他的,公共的业务由代理完

成,我们知道在dao层有很多事情是公共的,比如增,删,改都要加上事务,还有就是service层需要加日志,这种繁琐重复的事情,

假如每次增,删,改操作我们都要加事务,这样就很麻烦。加上静态代理就能使公共业务扩展变得更加集中。

缺点:增加了代理类,工作流变大了,开发效率太低了,所以就出现了动态代理。



0 0
原创粉丝点击