在编写@Configuration
配置类时,我们可能会看到proxyBeanMethods=false
这样的属性配置。这篇文章就基于实际结果来总结其作用。
show me your code
两个Bean定义
public class MyBean1 {
private MyBean2 myBean2;
@PostConstruct
public void testPostConstruct(){
System.err.println(getClass()+"postConstruct");
}
public void setMyBean2(MyBean2 myBean2) {
this.myBean2 = myBean2;
System.out.println("MyBean2: "+myBean2);
}
}
```json public class MyBean2 {
@PostConstruct public void testPostConstruct(){
System.err.println(getClass()+"postConstruct");
}
}
2. 配置两个Bean
```json
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public MyBean1 myBean1(){
MyBean1 myBean1 = new MyBean1();
myBean1.setMyBean2(myBean2());
myBean1.setMyBean2(myBean2());
return myBean1;
}
@Bean
public MyBean2 myBean2(){
System.out.println("myBean2()方法执行了");
return new MyBean2();
}
}
show me the result
proxyBeanMethods=true
结果解释:
myBean2()
在MyBean2
注册到IoC容器
时执行了一次- 之后
myBean1()
方法执行,set了两次myBean2()
。结果两次都是同一个MyBean2
-
proxyBeanMethods=false
第一次
myBean2()
执行是myBean1()
方法触发的首次set- 第二次
myBean2()
执行是myBean1()
方法触发的第二个set - 第三次
myBean2()
执行是MyBean2注册到IoC容器
时触发执行,走了一个生命周期 -
conclusion
proxyBeanMethods=true
- 直接调用@Bean方法后,走的是从容器获取
- proxyBeanMethods=false
- 直接调用@Bean方法后,和调用普通方法没区别
- SpringBoot2.2后默认为true
- 底层原理是@Bean方法是否被CGLib代理
- true:代理的话就走容器
- false:不代理的话就和调用普通方法一样
- false可以提高性能,前提是确定不会被直接方法调用