首先一句话:
@Configuration修饰的类会被Cglib动态代理,@Component不会。
详细:
Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。
即使用@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时是同一个
标签:同一个,区别,Autowired,Component,Bean,Configuration,public From: https://www.cnblogs.com/maerpao/p/17107004.html