Spring AOP动态代理实现,解决Spring Boot中无法…
2019-08-31 07:19:33来源:博客园 阅读 ()
Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理。
JDK动态代理
JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例。
如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类。
JDK动态代理具体实现原理:
通过实现
InvocationHandlet
接口创建自己的调用处理器;通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理;
通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;
CGLib动态代理
CGLib 全称 Code Generation Library
,是一个强大的高性能字节码生成类库,可以实现运行期动态扩展Java类。
Spring在运行期采用CGLib的字节码技术为类创建一个子类,并在子类中拦截所有父类方法的调用,织入横切逻辑实现AOP面向切面编程。
注意事项
如果被代理的对象实现了接口,那么Spring默认会使用JDK动态代理,否则会强制使用CGLib实现动态代理(如果被代理的类被final关键字所修饰,那么代理会失败)
关于两者的性能,JDK动态代理所创建的代理对象,在1.8以前的版本中性能并不高,最新版本中性能得到了很大的提升,和CGLib相差不大。
Spring Boot中无法正常启用JDK动态代理的问题
关于Spring的默认动态代理模式,官方文档中显示是JDK动态代理,但Spring Boot 2.2中发现即使强制指定@EnableAspectJAutoProxy(proxyTargetClass = false)
,生成的代理类依然显示$EnhancerBySpringCGLIB。
在DefaultAopProxyFactory
中发现isProxyTargetClass
被指定为强制代理目标类,所以会采用ObjenesisCglibAopProxy
创建代理。
最后跟踪到ValidationAutoConfiguration
中的一个Bean方法中,主动读取了环境变量spring.aop.proxy-target-class
,而且默认值是true。
问题点算是找到了,不过这里只是一个函数校验的处理器,竟然会强制读取魔法配置,有些莫名其妙...手工添加配置后JDK代理恢复正常。
@Bean
@ConditionalOnMissingBean
public static MethodValidationPostProcessor methodValidationPostProcessor(Environment environment, @Lazy Validator validator) {
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
boolean proxyTargetClass = environment.getProperty("spring.aop.proxy-target-class", Boolean.class, true);
processor.setProxyTargetClass(proxyTargetClass);
processor.setValidator(validator);
return processor;
}
原文链接:https://www.cnblogs.com/ronli/p/11437560.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash