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"
}
}
}
