本文共 1756 字,大约阅读时间需要 5 分钟。
为什么要学习代理模式?因为这就是SpringAOP的底层!
抽象角色:一般是接口或抽象类 真实角色:被代理的角色 代理角色:代理真实角色,代理后还会做一些附属操作 客户:访问代理角色的人可以是真实角色的操作更加纯粹!不用去关注一下公共的业务
公共业务就交给代理角色,实现的业务的分工。 公共业务拓展是,方便集中管理!一个真实角色就会产生一个代理角色,代码量会翻倍
动态代理和静态代理角色一样
动态代理是动态生成的,不是我们直接写好的! 动态代理分为两大类:基于接口的动态代理,基于类的动态代理 1.基于接口—JDk动态代理 2.基于类—cglib 3.java字节码实现:javasist 需要两个类:Proxy,invocationHandler可以是真实角色的操作更加纯粹!不用去关注一下公共的业务
公共业务就交给代理角色,实现的业务的分工。 公共业务拓展是,方便集中管理! 动态代理的是一个接口,一般就是应对的一类业务 一个动态代理可以代理多个类,只要实现的同一个接口环境搭建
Rentpackage demo;//租房public interface Rent { public void rent();}
Host
package demo;//房东public class Host implements Rent{ @Override public void rent() { System.out.println("房东要出租房子!"); }}
ProxyInvovationHandler
package demo;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//用这个类生成自动代理类public class ProxyInvovationHandler implements InvocationHandler { //被代理的接口 private Rent rent; public void setRent(Rent rent) { this.rent = rent; } //生成代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this); } //处理代理实例,并返回结果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //动态代理本质是反射 Object result = method.invoke(rent,args); return result; }}
Client
package demo;//客户public class Client { public static void main(String[] args){ //真实角色 Host host=new Host(); //代理角色 ProxyInvovationHandler pih = new ProxyInvovationHandler(); //通过调用程序处理角色来来处理我们调用的接口对象! pih.setRent(host); Rent rent=(Rent)pih.getProxy(); rent.rent(); }}
转载地址:http://clrwi.baihongyu.com/