【一句话】@Configuration和@Component的区别
首先一句话:
@Configuration修饰的类会被Cglib动态代理,@Component不会。
详细:
Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。
实际是因为
注解下有个proxyBeanMethods属性,默认值为true,即通过Cglib动态代理生成一个代理子类,对原始方法进行拦截,由BeanFactory处理;如果手动设为false,直接调用@Bean方法和@Autowired拿到的就不是同一个对象了。当然,你直接调用@Bean方法跟直接调用其他方法也没有区别了,相当于你直接调用的时候,没有被代理类执行,本来执行什么,现在执行什么。比如:B类下有个c对象是@Autowired的,如果把proxyBeanMethods设为false,直接调用@Bean方法生成的B类对象,c成员变量为null。
另外,如果你想搜索这个属性在哪里使用的话,去搜字符串,因为它的源码是这样的:
入口类:
org.springframework.context.annotation.ConfigurationClassUtils
即使用@Configuration时
@Autowired自动注入的对象和直接调用@Bean修饰的方法及多次调用@Bean修饰的方法拿到的是同一个对象。
当然,多个@Autowired自动注入的对象不管使用哪个注解拿到的都是同一个对象哈,因为默认是单例的嘛
看个例子就好理解了:
@Configuration
// @Component
public class Test {
@Bean
public A a(){
A a = new A();
a.setB1(b());
a.setB2(b());
return a;
}
@Bean
public B b(){
B b = new B ();
return b;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class OnlyTest {
@Autowired
private A a;
@Autowired
private B b3;
@Autowired
private B b4;
@Test
public void testCompare() {
System.out.println(a.getB1 == b3? "同一个b" : "不同的b");
System.out.println(b3 == b4? "同一个b" : "不同的b");
System.out.println(a.getB1() == a.getB2() ? "同一个b" : "不同的b");
}
}
运行结果:
使用@Configuration时:
同一个b
同一个b
同一个b
使用@Component时:
不同的b
同一个b
不同的b
解释一 下:
第一个判断,判断的是@AutoWired自动注入和直接调用@Bean方法获得的对象是不是同一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个
第二个判断,判断的是两个被@AutoWired自动注入的变量是不是同一个,结论:不管使用的是@Component还是@Configuration,都是同一个,因为默认是单例的,其实这种情况跟本次讨论的@Component和@Configuration的对比没关系,放这里是怕理解出现混淆
第三个判断,判断的是多次调用@Bean方法,返回的对象是不是一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个
相关文章
- 知识分享之MariaDB——MyISAM与Innodb引擎的区别
- Web中间件——Tomcat中的BIO、NIO、APR模式
- Java——Spring-webflow是做什么用的?
- Web中间件——Tomcat与Jetty的对比
- 可重写粒子网的数学实现:动态可重构系统的可行模型
- IDEA 中 Lombok 编译报错 Java 找不到符号问题
- Java 虚拟机之 CMS GC 调优解析
- java 论坛模块设计方案
- #国密sm2,sm4(前台vue,后台java)加解密
- 看完这篇Java基础,你也是天花板
- 包建强的培训课程(17):Java代码敏捷之道
- 64位jdk可以用32位eclipse吗?
- 有64位jdk能安32位eclipse吗?
- Eclipse如何配置JDK环境
- Java多线程
- Java多线程-JUC-1(八)
- Java多线程-ThreadLocal(六)
- Java多线程-ThreadPool线程池-3(五)
- Java多线程-ThreadPool线程池-2(四)
- Java多线程-ThreadPool线程池-1(三)