代理模式 ( 动态代理 ) CGLib 和 JDK小结

代理模式 (动态代理)CGLib 和 JDK小结

杂谈

疫情期间加班严重,快吐了,没时间整理博客了,这篇博客就当笔记用,会时不时更新的。

小结

代理模式还是蛮重要的,用的多,面试问的也多,哈哈。动态代理使用情况一般是两种CGLib和JDK。

JDK是采用读取接口的信息。

  1. 拿到被代理类的引用,并且通过反射获取它的所有接口。
  2. JDK Proxy 会重新生成一个实现了被代理类所有的接口的方法的那么一个类。
  3. 然后动态的生成java代码,把被代理类的增加的额外逻辑加入。
  4. 编译生成新的.class文件。
  5. 运行。

CGLib覆盖父类方法

  1. 步骤与jdk相似,但是不是针对接口,是针对代理类直接继承。

JDK Proxy 对于用户而言,必须要有一个接口实现,目标类相对来说复杂
CGLib 可以代理任意一个普通的类,不需要接口。

目的:都是生成一个新的类,去实现增强代码逻辑的功能

性能而言:
CGLib 生成代理逻辑更复杂,效率,调用效率更高,生成一个包含了所有的逻辑的FastClass,不再需要反射调用

JDK Proxy生成代理的逻辑简单,执行效率相对要低,每次都要反射动态调用

Spring 中的代理选择原则。

  1. 当Bean有实现接口的时候,Spring就会用JDK的动态代理。
  2. 当Bean没有实现接口的时候,Spring就会选择CGLib的动态代理。
  3. Spring可以通过配置强制使用CGLib,要在配置文件里面加上。
    <aop:aspectj-autoproxy proxy-target-class=“true”/>

总结

优点

  1. 代理模式能将代理对象与真实被调用的目标对象分离。
  2. 一定程度上降低了系统的耦合度,易于扩展。
  3. 代理模式可以起到保护目标对象的作用。
  4. 代理模式可以增强目标对象的职责。

缺点

代理模式会造成系统维护成本的增加,因为会生成多个的类,增加了系统的复杂度,并且增加了代理对象,会导致请求变慢。

注意事项

CGLib不能代理final的方法!!!

猜你喜欢

转载自blog.csdn.net/qq_29064815/article/details/106747722
今日推荐