Java动态代理笔记

最近在看 Spring4.3 官方文档,刚看到使用BeanFactoryPostProcessor接口实现容器功能扩展,利用这个接口可以修改Bean属性值,实现动态代理等。很多框架都是通过此接口来实现对Spring的扩展,如Mybatis与Spring集成时,只定义了Mapper接口,无实现类,Spring却可以完成自动注入。在这里看到动态代理,就复习下动态代理。

代理模式

代理模式基本上有subject,realSubject,proxy三个角色,其中 subject 是接口,realSubject 和 proxy 都实现此接口。realSubject 是实现完成真正业务的方法,proxy 在自身 request 请求中调用 realSubject 的方法。

代理分为静态代理和动态代理。静态代理在系统中写好代理类,执行代理操作。这样导致系统结构比较臃肿松散,为了解决这个问题产生了动态代理,动态代理对象用完就销毁。

JVM是通过字节码的二进制信息加载类的,那么,如果在运行期系统中,遵循.class文件组织结构生成相应二进制数据,然后再把这个二进制数据加载转换成对应的类,这样就完成了在代码中动态创建一个类的能力。动态代理即是采用了JVM这个原理。

关于动态代理

  1. 出发点,为了在不入侵源码的情况下在原先方法基础上添加另外的业务逻辑
  2. 动态代理的基本模式是代理对象将自己方法功能的实现交给 InvocationHandler 处理,外界对 proxy 每个方法的调用都通过 InvocationHandler invoke 方法来处理
  3. 动态代理步骤:新建 realSubject 对象,获取 realSubject 对象所有接口,创建 InvocationHandler 实现类,由接口和 handler 创建代理对象。
  4. JDK生成的代理类继承JDK的Proxy类,实现了 realSubject 的所有接口,代理类中的所有方法都是 final 方法,所有代理类的方法都统一调用 InvocationHandler 的 invoke() 方法。

参考文章:https://www.cnblogs.com/rinack/p/7742682.html

发布了35 篇原创文章 · 获赞 14 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/U___U/article/details/102576482
今日推荐