在编写@Configuration配置类时,我们可能会看到proxyBeanMethods=false这样的属性配置。这篇文章就基于实际结果来总结其作用。
show me your code
两个Bean定义
public class MyBean1 {private MyBean2 myBean2;@PostConstructpublic 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 {@Beanpublic MyBean1 myBean1(){MyBean1 myBean1 = new MyBean1();myBean1.setMyBean2(myBean2());myBean1.setMyBean2(myBean2());return myBean1;}@Beanpublic 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可以提高性能,前提是确定不会被直接方法调用
 
