proxy动态代理持久化意义
jdk本身的动态代理技术得到了广泛的应用,如:mybatis mapper,spring cloud openFeign。那么我们在研究分析这个源码的时候,由于生成的动态代理类是在内存中的,致使我们无法看到.class的面目,增加了我们查看源码,分析原理,学习技术的难度。而对java和spring来说,都开了口子,通过设置环境变量来生成.class。
直接上配置方式
方式一:-D环境变量设置
## java动态代理持久化为.class文件配置方式
-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true
## cglib动态代理持久化为.class文件配置方式
-Dcglib.debugLocation=/Users/xxx
通过idea配置的话,方式如下图
方式二:main方法配置
## java动态代理持久化为.class文件配置方式
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
## cglib动态代理持久化为.class文件配置方式
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/xxx");
实践过程中,发现main方法配置
方式中的java动态代理持久化为.class不起作用,原因还不明。
总结
个人觉得,通过-D环境变量设置
更方便,无侵入性。如果你要看spring boot
对constroller
、service
等生成的代理class
,因为他们是spring boot
用cglib
方式生成的,所以配置上cglib动态代
理;如果你要看@Mapper
、@FeignClient
生成的代理class
,因为他们是jdk
方式生成的,所以配置上java动态代理
。
效果
配置好,启动项目后,动态代理持久化为.class文件会在项目目录下生成
我是spring boot项目,添加了spring-boot-actuator监控组件包,所以可以通过EndPoint功能查看刚配置的环境变量
$ curl -X GET 'http://localhost:8080/env'
{
name: "systemProperties",
properties: {
... ...
sun.misc.ProxyGenerator.saveGeneratedFiles:{
value: "true"
}
}
}