spring 學習筆記(一)java裝配bean

儘管組件掃描和自動裝配實現了自動劃配置,但是你想把第三方庫的組件裝配到應用中,組件掃描和自動裝配是無法完成的。這時候就需要顯示裝配了。有兩種方案可以選:java和xml。

首先簡單聲明一個bean

@Bean
public CompactDisc sgtPeppers(){
   return new sgtPeppers{};
}

在這個例子中@Bean註解會告訴Spring這個方法會返回一個對象,該對象要註冊爲Spring應用上下文中的bean。方法體中包含最終產生bean實例的羅技。

通過制定bean的ID可以爲這個bean制定不同的ID

@Bean {name = "lonelyHeartClubNand"}

藉助JavaConfig實現注入

在JavaConfig中裝配bean的最簡單方式就是引用創建bean的方法。

下面需要聲明CDPlayer bean,它依賴於CompactDisc。

 public class CDPlayerConfig {
@Bean
public CDPlayer(){
  return new CDPlayer (sgtPeppers())
}
}


cdPlayer()的方法體與sgtPeppers()稍微有些區別。在這裏並沒有使用默認的構造器構建實例,而是調用了需要傳入CompactDisc對象的構造器來創建CDPlayer實例。


看起來,CompactDisc是通過調用sgtPeppers()得到的,但情況並非完全如此。因爲sgtPeppers()方法上添加了@Bean註解,Spring將會攔截所有對它的調用,並確保直接返回該方法所創建的bean,而不是每次都對其進行實際的調用。比如說,假設你引入了一個其他的CDPlayerbean,它和之前的那個bean完全一樣。

package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
  
  @Bean
  public CompactDisc compactDisc() {
    return new SgtPeppers();
  }
  
  @Bean
  public CDPlayer cdPlayer(CompactDisc compactDisc) {
    return new CDPlayer(compactDisc);
  }


}

假如對sgtPeppers()的調用就像其他的Java方法調用一樣的話,那麼每個CDPlayer實例都會有一個自己特有的SgtPeppers實例。如果我們討論的是實際的CD播放器和CD光盤的話,這麼做是有意義的。如果你有兩臺CD播放器,在物理上並沒有辦法將同一張CD光盤放到兩個CD播放器中。但是,在軟件領域中,我們完全可以將同一個SgtPeppers實例注入到任意數量的其他bean之中。默認情況下,Spring中的bean都是單例的,我們並沒有必要爲第二個CDPlayer bean創建完全相同的SgtPeppers實例。所以,Spring會攔截對sgtPeppers()的調用並確保返回的是Spring所創建的bean,也就是Spring本身在調用sgtPeppers()時所創建的CompactDiscbean。因此,兩個CDPlayer bean會得到相同的SgtPeppers實例。可以看到,通過調用方法來引用bean的方式有點令人困惑。

其實還有一種理解起來更爲簡單的方式:

package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
  @Bean
  public CDPlayer cdPlayer(CompactDisc compactDisc) {
    return new CDPlayer(compactDisc);
  }

}
在這裏,cdPlayer()方法請求一個CompactDisc作爲參數。當Spring調用cdPlayer()創建CDPlayerbean的時候,它會自動裝配一個CompactDisc到配置方法之中。然後,方法體就可以按照合適的方式來使用它。藉助這種技術,cdPlayer()方法也能夠將CompactDisc注入到CDPlayer的構造器中,而且不用明確引用CompactDisc的@Bean方法。


在這裏使用CDPlayer的構造器實現了DI(依賴注入)功能,完全可以採用其他風格的DI配置。比如說,如果想通過Setter方法注入CompactDisc的話,那麼代碼看起來應該是這樣的:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
	CDPlayer cdPlayer = new CDPlayer (CompactDisc);
	cdPlayer.setCompactDisc(compactDisc);
	return cdPlayer
}
再次強調一遍,帶有@Bean註解的方法可以採用任何必要的Java功能來產生bean實例。構造器和Setter方法只是@Bean方法的兩個簡單樣例。這裏所存在的可能性僅僅受到Java語言的限制。
看起來,CompactDisc是通過調用sgtPeppers()得到的,但情況並非完全如此。因爲sgtPeppers()方法上添加了@Bean註解,Spring將會攔截所有對它的調用,並確保直接返回該方法所創建的bean,而不是每次都對其進行實際的調用。比如說,假設你引入了一個其他的CDPlayerbean,它和之前的那個bean完全一樣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章