spring ---代理模式
spring AOP的底层是动态代理实现的。
角色分析:
-
抽象角色:一般由抽象类和接口来实现
-
真实角色:被代理的角色
-
代理 :代理真是角色,并做一些附加操作
-
客户:调用者,访问者
//抽象 public interface Rent { void rent(); } //真实 public class Host implements Rent { @Override public void rent() { System.out.println("房主要出租房子"); } } //代理 public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { see(); host.rent(); sign(); } public void see(){ System.out.println("中介看房!!!"); } public void sign(){ System.out.println("签定合同!!!"); } } //客户 public static void main(String[] args) { Host host =new Host(); Proxy proxy = new Proxy(host); proxy.rent(); }
优点:
-
使真实角色的操作更加纯粹,不用去关注一些公共业务
-
公共部分交给代理,实现业务分工
-
公共业务发生扩展的时候,方便集中管理
缺点:
-
一个真实客户产生一个代理,代码量增加,工作重复
动态代理则解决了静态代理代码重复的问题。
反射可以动态的修改类。
-
动态代理类是动态生成的,不是我们直接写好的。
-
动态代理分类
-
基于接口实现的----JDK动态代理
-
基于类实现的----cglib
-
字节码实现 -----JAVAsist
-
public interface Rent { void rent(); }
真实角色
public class Host implements Rent { @Override public void rent() { System.out.println("房主要出租房子"); } }
动态代理工具类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //动态代理生成模板 public class ProxyInvocationHandler implements InvocationHandler { //被代理的接口 private Object target; public void setTarget(Object target) { this.target = target; } //生成代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this); } //处理代理实例 并得到返回结果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res= method.invoke(target,args); return res; } }
动态代理实现类
public class Client { public static void main(String[] args) { //真实角色 Host host =new Host(); //静态代理 /* Proxy proxy = new Proxy(host); proxy.rent(); */ //动态代理 ProxyInvocationHandler pih = new ProxyInvocationHandler(); //注入要代理的真实对象 pih.setTarget(host); //动态生成 真实对象接口的代理 Rent proxy = (Rent) pih.getProxy(); //使用代理调用真实对象方法 proxy.rent(); } }
优点:
-
使真实角色的操作更加纯粹,不用去关注一些公共业务
-
公共部分交给代理,实现业务分工
-
公共业务发生扩展的时候,方便集中管理
-
一个动态代理类代理的是一个接口,一般就是对应的一类与业务
-
一个动态代理类可以代理多个类,只要是实现了同一个接口即可