初学Spring之动态代理模式
动态代理和静态代理角色一样
动态代理的代理类是动态生成的
动态代理分为两大类:
基于接口的动态代理(JDK 动态代理)、基于类的动态代理(cglib)
也可以用 Java 字节码实现(Javassist)
Proxy:代理
InvocationHandler:调用处理程序
动态代理的本质,就是使用反射机制实现
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 result = method.invoke(target, args);
return result;
}
}
客户端访问时,
先 new 一个真实角色,
再 new 一个代理角色(本质上这个代理角色不存在)
设置要代理的对象,调用 set 方法
最后动态生成代理类,调用 getProxy() 方法,强转成真实角色
总结:
InvocationHandler 是由代理实例的调用处理程序实现的接口
每个代理实例都有一个关联的调用处理程序,
当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的 invoke 方法
Proxy 提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类
动态代理的好处:
1.真实角色操作更纯粹,不用去关注公共业务
2.公共业务交给代理角色,实现业务分工
3.公共业务发生扩展时,方便集中管理
4.一个动态代理类代理的是一个接口
原文地址:https://blog.csdn.net/m0_58838332/article/details/140230946
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!