《Terraform 101 從入門到實踐》這本小冊在南瓜慢說官方網站和GitHub兩個地方同步更新,書中的示例代碼也是放在GitHub上,方便大家參考查看。 不怕出身低,行行出狀元。 插件 Terraform可以對多種平臺的多種資源進行管理,這個是通過插件來實現的。 這裡的插件,在Terrafor ...
首先一句話:
@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時是同一個