Springboot2中新增的注解属性proxyBeanMethods,默认是true;
可以修改外false; 例如:
@Configuration(proxyBeanMethods = false)
这个属性大致的意思是:
proxyBeanMethods代表的是,如果是true的话,那么这个配置类就会被代理了,如果是false的话,那么就不会被代理。
实际应用中使用主要是为了性能;因为
当使用代理对象的调用它的方法,会检测容器中是不是有了这样的组件,如果有,则不再新建组件,直接将已经有的组件返回。 如果说没有的话,才会新建组件。这样保证了容器中的组件始终就保持单一性。不过这也有一个不好的地方,那就是每次都要检测,会降低速度。
关于Spring的代理机制描述:
- 主要概念:
CGLIB: CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承的方式实现代理;它可以在运行期扩展Java类与实现Java接口 SpringBoot 2.x开始,为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB。 如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxyTargetClass配置已无效。 CGLIB是针对类来实现代理的,它的原理是对指定目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
- 主要逻辑:
Spring会扫描所有被注解的bean的信息放到容器中进行管理。 Spring会遍历所有的bean信息, 如果发现其中有标记了@Configuration注解的,会对这个类进行CGLIB代码,生成一个代理的类,并且把这个类设置到BeanDefenition的Class属性中。 当需要拿到这个bean的实例的时候,会从这个class属性中拿到的Class对象进行反射 Spring会先去容器中查看一下是否有这个bean的实例了,如果有了的话,就返回已有对象,没有的话就创建一个,然后放到容器中