@Configuration与@Component区别
@Configuration注解源码中被@Component标注,所以说@Configuration同样也是一个组件
相比于@Component注解,@Configuration注解中多了一个方法boolean proxyBeanMethods() default true;
中文直译就是 代理bean的方法 ,它的默认值是true
经过以下代码测试出这个方法的作用
配置类
//proxyBeanMethods()方法默认值为true,所以就不写了
@Configuration
public class JavaConfig {
@Bean
public User user(){
User jack = new User("jack", 21);
//user组件依赖了Pet组件(将tomCat注入进user)
jack.setPet(tomCat());
return jack;
}
@Bean
public Pet tomCat(){
return new Pet("tomcat");
}
}
主程序
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//获取配置类对象
JavaConfig bean1 = run.getBean(JavaConfig.class);
//打印配置类对象
System.out.println(bean1);
User user = run.getBean("user",User.class);
Pet tomCat = run.getBean("tomCat", Pet.class);
System.out.println("user中的pet是否是容器中的pet:" + (user.getPet() == tomCat));
}
}
返回的结果
然后将@Configuration注解的proxyBeanMethod方法的值修改为false
@Configuration(proxyBeanMethods = false)
其它不做改动,再进行测试
测试结果
两个测试结果的不同:
方法值为true的时候:
配置类的对象多了$$EnhancerBySpringCGLIB$$
user中注入的pet就是容器中的pet
方法值为false的时候:
配置类的对象少了$$EnhancerBySpringCGLIB$$
user中注入的pet不是容器中的pet,是新new出来的(但是属性值是一样的)
总结:
proxyBeanMethod()为true的时候,代理对象多了$$EnhancerBySpringCGLIB$$
EnhancerBySpringCGLIB是被SpringCGLIB增强了的对象
Full(proxyBeanMethods = true) 每个@Bean被调用多少次返回的都是单实例的(全模式)
Lite(proxyBeanMethods = false) 每个@Bean被调用多少次返回的都是新创建的 (轻量级模式)
使用场景
(proxyBeanMethods = true)
配置类中的组件中含有依赖关系,组件依赖必须使用Full模式默认
(proxyBeanMethods = false)
配置类中的组件中没有依赖关系,如果方法为true,调用容器中的bean的时候,都会去检查是否含有bean中所需要的依赖bean,这是需要花费时间的,如果组件中没有依赖关系,就可以为false,省去检查是否有相对应的依赖bean的时间。