指定是否应该代理@Bean方法以强制执行Bean生命周期行为,例如,即使在用户代码中直接调用@Bean方法时也返回共享的Singleton Bean实例。这个特性需要方法拦截,它是通过运行时生成的CGLIB子类实现的,这个子类有一些限制,比如不允许Configuration类及其方法声明最终结果。
缺省值为True,允许通过Configuration类内的直接方法调用进行“Bean间引用”,以及对此配置的@Bean方法的外部调用,例如从另一个配置类。如果不需要这样做,因为此特定配置的每个@Bean方法都是自包含的,并且被设计为容器使用的普通工厂方法,请将此标志切换为FALSE,以避免CGLIB子类处理。
关闭Bean方法拦截可以有效地单独处理@Bean方法,就像在非@Configurity类上声明时一样。“@Bean Lite模式”(参见@Bean的javadoc)。因此,它在行为上等同于移除@configuration构造型。
模式说明(Full 模式和 Lite 模式)
proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
注意说明:
**`组件依赖必须使用Full模式默认。其他默认是否Lite模式`**
springboot 默认环境
测试 javabean
MyBean.java
package com.example.proxybeanmethods;
public class MyBean {
public MyBean() {
System.out.println("MyBean 的 无参构造方法");
}
}
配置类
SpringJavaConfig.java
package com.example.proxybeanmethods;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//@Configuration(proxyBeanMethods = false)
@Configuration(proxyBeanMethods = true)//默认为true
@ComponentScan("com.example.proxybeanmethods")
public class SpringJavaConfig {
@Bean
public MyBean myBean(){
return new MyBean();
}
}
测试类
package com.example.proxybeanmethods;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ConfigurationProxyBeanMethodsTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringJavaConfig.class);
SpringJavaConfig config = ac.getBean(SpringJavaConfig.class);
MyBean myBean = config.myBean();
MyBean myBean2 = config.myBean();
System.out.println("两个对象是否相等: "+(myBean==myBean2));
System.out.println(config);
System.out.println(myBean);
System.out.println(myBean2);
}
}
控制台打印
MyBean 的 无参构造方法
两个对象是否相等: true
com.example.proxybeanmethods.SpringJavaConfig E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB841c9b19@96def03
com.example.proxybeanmethods.MyBean@5ccddd20
com.example.proxybeanmethods.MyBean@5ccddd20
控制台打印
MyBean 的 无参构造方法
MyBean 的 无参构造方法
MyBean 的 无参构造方法
两个对象是否相等: false
com.example.proxybeanmethods.SpringJavaConfig@5a4aa2f2
com.example.proxybeanmethods.MyBean@6591f517
com.example.proxybeanmethods.MyBean@345965f2
Config@5a4aa2f2
com.example.proxybeanmethods.MyBean@6591f517
com.example.proxybeanmethods.MyBean@345965f2