上一篇部落格中,我們講解了使用元件掃描和自動裝配實現自動化裝配bean,這也是最好的使用方式。
但是某些場景下,我們可能無法使用自動裝配的功能,此時就不得不顯式的配置bean。
比如我們引用了一個第三方類庫,需要將類庫中的某個類裝配到專案中,我們不可能在該類上新增@Component註解,因此無法使用自動裝配的功能。
Spring中有以下兩種方式顯式配置bean:
- 通過JavaConfig配置bean
- 通過xml配置bean
本篇部落格主要講解下通過JavaConfig配置bean的實現方法,通過xml配置bean的實現方法後續再單獨寫一篇部落格。
我們還使用上一篇部落格中的例子,不過程式碼會做適當修改。
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註解。**
1.建立配置類
package soundsystem.javaconfig;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
}
複製程式碼
2.宣告bean
在JavaConfig中,我們使用@Bean註解來宣告bean,如下所示:
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,不過我們可以自定義:
@Bean(name = "lonelyHeartsClub")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
複製程式碼
上面宣告的bean比較簡單,沒有任何其它依賴,但是有些複雜的bean,比如CDPlayer,它依賴於CompactDisc,那我們該如何宣告呢?
簡單的一種方式是,直接使用剛剛定義的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);
}
}
複製程式碼
3.驗證bean是否裝配成功
新建測試類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裝配成功。4.原始碼地址
github.com/zwwhnly/Spr…,歡迎大家下載,有問題可以多多交流。