在前文中介紹了 Spring 隱式創建 Bean 的方式(@Component + @Autowired + 組件掃描)。但當引入第三方類庫時,無法在其源碼上添加註解,自動裝配便失效。此時需使用 Java 代碼顯式實現 Bean 的定義與裝配。
沿用 CD 播放器例子,包含兩個介面:MediaPlayer / CompactDisc,以及多種實現類:
MediaPlayer 實現:CDPlayerCompactDisc 實現:CompactDisc_guangliang、CompactDisc_wangfei、CompactDisc_zhoujielun、CompactDisc_xusong多實現類的設計是為了驗證 Spring 單例 Bean 的特性:每個 Bean 定義在容器中只會創建一個對象實例。
package com.spring.javabeans.cd;
import org.springframework.beans.factory.annotation.Autowired;
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
@Autowired // 構造器注入
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
@Override
public void player() {
System.out.println("使用 CD 播放!");
}
}
package com.spring.javabeans.cd; public class CompactDisc_guangliang implements CompactDisc { private String title = "童話"; private String artist = "光良"; @Override public void play() { System.out.println("播放:" + title + " 來自藝術家:" + artist); } }Java 配置類:@Bean 註解詳解
通過
@Configuration標註的配置類中,使用@Bean註解聲明 Bean 定義:package com.spring.javabeans.cd; import org.springframework.context.annotation.Bean; public class CDPlayerConfig { @Bean public CompactDisc randomBeatlesCD() { int key = (int) Math.floor(Math.random() * 4); if (key == 0) return new CompactDisc_zhoujielun(); else if (key == 1) return new CompactDisc_xusong(); else if (key == 2) return new CompactDisc_guangliang(); else return new CompactDisc_wangfei(); } @Bean public CDPlayer cdplayer(CompactDisc cd) { return new CDPlayer(cd); } }關鍵點解析
@Bean 告訴 Spring:此方法返回的對象應註冊為 BeanrandomBeatlesCD、cdplayer)cdplayer 方法參數 CompactDisc cd 會自動從容器中尋找匹配的 Bean 注入package com.spring.javabeans.cd;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDTest {
@Autowired
private MediaPlayer player;
@Autowired
private CompactDisc cd;
@Test
public void test1() {
assertNotNull(player);
assertNotNull(cd);
}
@Test
public void test2() {
player.player();
cd.play();
}
}
@RunWith(SpringJUnit4ClassRunner.class):啟用 Spring 測試支持@ContextConfiguration(classes=CDPlayerConfig.class):指定配置類@Autowired:依賴注入,驗證 Bean 是否正確裝配Java Config 方式(@Configuration + @Bean)提供了類型安全、重構友善、邏輯可控的 Bean 定義方式,特別適合第三方庫整合、複雜條件裝配等場景。它是現代 Spring 應用開發的推薦配置方式。