【一句话】@Configuration和@Component的区别
  ssbY8JrwAR4j 2023年11月01日 76 0

首先一句话:

@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时是同一个

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   114   0   0 Java
  8s1LUHPryisj   2024年05月17日   49   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
ssbY8JrwAR4j