Spring bean 裝配

裝配 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: https://spring.io/tools
此工具有Eclipse、Visual Studio Code、Atom支持,可幫助我們編寫xml配置文件

  • 對強依賴使用構造器注入;對選擇性的依賴使用屬性注入。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章