一,代理模式
为什么要学习代理模式?因为这就是SpringAOP的底层!【Spring AOP 和SpringMVC】
代理模式分类:
静态代理
动态代理
那到底什么是代理模式呢?
看图!
最佳理解(优点恶趣味):上图的关系可以这么理解(mybatis就是房东,servioce就是中介,controller就是客户)
通俗点也可以看作是 入土,代理帮你火化
1.2静态代理
角色分析:
抽象角色:一般会使用接口或抽象类来解决(相当于图上的租房,即 真实角色和代理共同想做的事情)
真实角色:被代理角色(真正想做事的人)
代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作
客户:访问代理对象的人
代码步骤
1,接口(抽象角色)
//租房 public interface Rent { public void rent(); }
2,真实角色
//房东 public class Host implements Rent{ public void rent() { System.out.println("房东要出租房子!"); } }
3,代理角色
package com.king.demo01; public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { seeHouse(); host.rent(); hetong(); fare(); } //看房 public void seeHouse(){ System.out.println("中介带你看房"); } //合同 public void hetong(){ System.out.println("签合同"); } //收中介费 public void fare(){ System.out.println("收中介费"); } }
4,客户
package com.king.demo01; //客户 public class Client { public static void main(String[] args) { Host host = new Host(); //代理 Proxy proxy = new Proxy(host); proxy.rent(); } }
代理模式的好处:
可以使真实角色的操作更加纯粹!,不用关注一些公共业务!
公共的业务交给代理角色干!,实现了业务分工!
公共业务发生扩展的时候,方便集中管理!
缺点
一个真实角色只会产生一个代理角色,代码量会翻倍,开发效率会变低
1.3,静态代理模式加深理解
接口(抽象角色)
package com.king.demo02; public interface UserService { public void add(); public void delete(); public void update(); public void query(); }
真实角色
package com.king.demo02; //真实对象 public class UserServiceImpl implements UserService { public void add() { System.out.println("增加一个用户"); } public void delete() { System.out.println("删除一个用户"); } public void update() { System.out.println("修改一个用户"); } public void query() { System.out.println("查询一个用户"); } }
代理角色
package com.king.demo02; public class userServiceProxy implements UserService { private UserServiceImpl userService; //通过setter进行属性注入符合Spring的ioc实现方法DI的底层 public void setUserService(UserServiceImpl userService) { this.userService = userService; } public void log(String msg){ System.out.println("使用了"+msg+"方法"); } public void add() { log("add"); userService.add(); } public void delete() { log("del"); userService.delete(); } public void update() { log("update"); userService.update(); } public void query() { log("query"); userService.query(); } }
客户
package com.king.demo02; //客户 public class Client { public static void main(String[] args) { UserServiceImpl userService = new UserServiceImpl(); //先走无参创建对象 userServiceProxy proxy = new userServiceProxy(); //再通过set方法,实现属性注入,当然有参也能实现,原因:符合Spring依赖注入的方式 proxy.setUserService(userService); proxy.add(); } }
小结:使用代理模式的目的就是为了保证业务层代码保持不变,可变性强的操作,再代理层实现
二,动态代理模式
1,动态代理和静态代理的角色一样
2,动态代理的代理类是动态生成的,不是我们直接写好的!
3,动态代理的实现分为两大类:基于接口的动态代理,基于类的动态代理
基于接口-----JDK动态代理【在这里使用这个】
基于类:cglib
java字节码实现:javasist
需要了解两个类:Poxy,代理 InvocationHandler,调用处理程序