上一篇博客中,咱們講解了使用組件掃描和自動裝配實現自動化裝配bean,這也是最好的使用方式。java
可是某些場景下,咱們可能沒法使用自動裝配的功能,此時就不得不顯式的配置bean。git
好比咱們引用了一個第三方類庫,須要將類庫中的某個類裝配到項目中,咱們不可能在該類上添加@Component註解,所以沒法使用自動裝配的功能。github
Spring中有如下兩種方式顯式配置bean:spring
本篇博客主要講解下經過JavaConfig配置bean的實現方法,經過xml配置bean的實現方法後續再單獨寫一篇博客。app
咱們還使用上一篇博客中的例子,不過代碼會作適當修改。ide
package soundsystem.javaconfig; public interface CompactDisc { void play(); }
package soundsystem.javaconfig; public class SgtPeppers implements CompactDisc { @Override public void play() { String title = "Sgt.Pepper's Lonely Hearts Club Band"; String artists = "The Beatles"; System.out.println("Playing " + title + " By " + artists); } }
package soundsystem.javaconfig; public class CDPlayer { private CompactDisc compactDisc; public CDPlayer(CompactDisc compactDisc) { this.compactDisc = compactDisc; } public void play() { compactDisc.play(); } }
注意:和上一篇博客相比,咱們去掉了SgtPeppers類和CDPlayer類上的@Component註解。測試
package soundsystem.javaconfig; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { }
在JavaConfig中,咱們使用@Bean註解來聲明bean,以下所示:this
package soundsystem.javaconfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public CompactDisc sgtPeppers() { return new SgtPeppers(); } }
默認生成的bean ID和方法名一致,即sgtPeppers,不過咱們能夠自定義:code
@Bean(name = "lonelyHeartsClub") public CompactDisc sgtPeppers() { return new SgtPeppers(); }
上面聲明的bean比較簡單,沒有任何其它依賴,可是有些複雜的bean,好比CDPlayer,它依賴於CompactDisc,那咱們該如何聲明呢?xml
簡單的一種方式是,直接使用剛剛定義的sgtPeppers()方法做爲CDPlayer構造器的參數依賴:
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); }
不過更建議的是如下方式,將依賴項做爲bean方法的參數,Spring會自動匹配到參數依賴項:
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); }
此時配置類的代碼爲:
package soundsystem.javaconfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean //@Bean(name = "lonelyHeartsClub") public CompactDisc sgtPeppers() { return new SgtPeppers(); } /*@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); }*/ @Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); } }
新建測試類CDPlayerTest:
package soundsystem.javaconfig; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class CDPlayerTest { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(CDPlayerConfig.class); CompactDisc compactDisc = (SgtPeppers) applicationContext.getBean("sgtPeppers"); compactDisc.play(); CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class); cdPlayer.play(); } }
運行結果:
從運行結果能夠看出,bean裝配成功。
源碼地址:https://github.com/zwwhnly/spring-action.git,歡迎下載。