首先一句話:
@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時是同一個
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543380.html
標籤:Java
