裝配 bean
1. 自動化裝配
@Component
告知Spring為被註解的類建立bean
> 為bean命名:
> + Spring為Bean預設命名為類名首字母小寫
> + @Component("XXX")
> + @Named("XXX")
@ComponentScan
元件掃描預設不可用,需用此註解顯式配置
設定元件掃描基礎包:
- 預設以配置類(帶@Configuration)所在的包為基礎包
@ComponentScan({"XXX", "XXX2"})/@ComponentScan(basePackages = {"XXX", "XXX2"})
指定基礎包,使用String作為value值,型別不安全@ComponentScan(basePackageClasses = {XXX.class, XXX2.class})
使用類來作為value值,這些類所在的包
將作為基礎包;注: 也可以在包中建立僅用於掃描的
空標記介面
,使用其作為value值;
@Autowire
自動裝配,將已建立的bean自動注入到當前類中,可用於:
- 構造器
@Autowired
public CDPlayer(CopactDisc cd){
this.cd = cd;
}
複製程式碼
> + 屬性的Setter方法
複製程式碼
@Autowired
public void setCompactDisc(CopactDisc cd){
this.cd = cd;
}
複製程式碼
> + 類的任何方法上
複製程式碼
@Autowired
public void insertDisc(CompactDisc cd){
this.cd = cd;
}
複製程式碼
自動裝配結果:
- 有且只有一個bean匹配依賴需求,將其裝配進來
- 沒有匹配的bean,建立應用上下文時,Spring丟擲異常;若要避免,將@Autowired的
required
屬性設定為false,此時,要裝配的bean為null,需要程式碼進行null檢查- 多個匹配的bean,Spring丟擲異常
@Named 和 @Inject
@Inject註解來源於java依賴注入規範,大部分情況下可與@Autowired互換
2. 通過程式碼裝配Bean
若想將第三方庫中的元件裝配到應用中,無法新增自動掃描和裝配的註解,此時,需要採用顯式裝配的方式。
XML
javaConfig
更強大、型別安全、對重構友好
- 不應該包含任何業務邏輯
- 不應該侵入到任何業務邏輯程式碼中(不和其他類發生關聯)
- 通常放到單獨的包中
建立一個配置類
import org.springframework.context.annotation.Configuration
@Configuration//表明這個類是配置類
public class TestConfig {
}
複製程式碼
@Bean
宣告一個簡單bean
此註解告訴Spring:
- 被其標記的方法返回的物件,要註冊為Spring上下文中的bean; 方法體中包含最終產生bean例項的邏輯.
@Bean
public BeanObject createBean(){
return new BeanObject();
}
複製程式碼
- Bean的id預設和被註解的方法名一樣,支援重新命名,使用Bean註解的
name
屬性
Bean注入
- 方式1: 引用建立Bean的方法 eg: 若要在BeanObject2中注入BeanObject1,如下
@Bean
public BeanObject2 inject(){
return new BeanObject2(createBean());
}
@Bean
public BeanObject2 inject2(){
return new BeanObject2(createBean());
}
複製程式碼
Spring會攔截所有對createBean()方法的呼叫,並確保直接返回該方法所建立的bean; Spring預設是單例的,上述程式碼中,兩個BeanObject2的bean中注入的是同一個BeanObject1的bean
- 方式2: 請求一個實現類bean的介面型別作為引數
/**假設BeanObject是介面BeanObject1Interface的實現類
**/
@Bean
public BeanObject2 inject(BeanObject1Interface object1){
return new BeanObject2(object1);
}
複製程式碼
這是引用其他bean的最佳選擇,不要求將BeanObject1Interface宣告到同一個配置類中,甚至沒要求其必須在javaConfig中宣告,可以通過元件掃描或xml進行配置。不管介面是採用什麼方式建立出來的,Spring都會將其傳入到配置方法中,用來建立BeanObject2 bean。
另外,除了構造器,我們還可以使用任何java功能來產生bean例項,比如setter方法等。
3. XML裝配
Spring Tool Suite: spring.io/tools 此工具有Eclipse、Visual Studio Code、Atom支援,可幫助我們編寫xml配置檔案
- 對強依賴使用構造器注入;對選擇性的依賴使用屬性注入。