首先一句话:

@Configuration修饰的类会被Cglib动态代理,@Component不会。

详细:

Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。

实际是因为

注解下有个proxyBeanMethods属性,默认值为true,如果手动设为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时是同一个

最新文章

  1. 2016 ICPC大连站---F题 Detachment
  2. cve-2015-5122漏洞分析
  3. select接收后台返回值的解决方案
  4. 如何建立一个完整的游戏AI
  5. oracle: tochar(sysdate,'D')函数
  6. linux下的struct sigaction
  7. 怎样在Android中ListView与ArrayAdapter配合使用
  8. EXCEL处理数据小技巧
  9. 06---Java基础、面向对象
  10. JSON-lib框架,转换JSON、XML不再困难
  11. php根据用户输入单词,匹配相似单词
  12. deeplearning.ai 神经网络和深度学习 week2 神经网络基础 听课笔记
  13. 解决关于win10下eclipse代码格式化不生效问题
  14. SSH 远程登陆
  15. 一个MMORPG的常规技能系统
  16. python概念-Socket到底有多骚
  17. python 写入execl记录
  18. Android-FileIOUtils工具类
  19. windows过滤指定IP
  20. Java之关于JSTL引入问题

热门文章

  1. php自定义分页类
  2. hwlog--utils.go
  3. 【深入浅出 Yarn 架构与实现】3-3 Yarn Application Master 编写
  4. 【Devexpres】spreadsheetControl设置可见范围
  5. HSSFSheet XSSFWorkbook SXSSF Java读取Excel数据
  6. Golang反射修改变量值
  7. 论文翻译:2022_DNS_1th:Multi-scale temporal frequency convolutional network with axial attention for speech enhancement
  8. k8s驱逐篇(5)-kube-controller-manager驱逐
  9. kernel 启动流程
  10. C#从实习到搬砖