Spring bean 裝配

yzy199391發表於2019-04-15

裝配 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配置檔案

  • 對強依賴使用構造器注入;對選擇性的依賴使用屬性注入。

相關文章