在 Spring 容器中,每個 Bean 擁有唯一的 `id`(或 `name`)作為標識。但實際專案中,常遇到同一個 Bean 需以不同名稱被不同模組引用的場景:舊系統遷移兼容、多團隊協作命名規範不一、同一服務對外暴露不同語義名稱等。Spring 提供 `
<bean id="helloWorld3" factory-bean="helloWorldFactory" factory-method="getInstance"></bean>
<!-- 定義別名:name 指向原 Bean id,alias 為新別名 -->
<alias name="helloWorld3" alias="abc" />
<alias name="helloWorld3" alias="測試" />
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 原始 id 獲取
HelloWorld hello1 = (HelloWorld) context.getBean("helloWorld3");
// 別名獲取——完全等價
HelloWorld hello2 = (HelloWorld) context.getBean("abc");
HelloWorld hello3 = (HelloWorld) context.getBean("測試");
// 驗證為同一實例(單例模式下)
System.out.println(hello1 == hello2); // true
| 場景 | 問題 | 別名解決方案 |
|---|---|---|
| 舊系統遷移 | 舊代碼大量使用 `userService`,新規範要求 `userServiceImpl` | 保留 `id="userServiceImpl"`,加 ` |
| 多團隊協作 | A 組慣用 `orderDao`,B 組慣用 `orderMapper` | Bean 定義一次,雙別名滿足雙方習慣,避免重複定義或衝突 |
| 語義區分 | 同一 `DataSource` 既作「主庫」又作「報表庫」 | `id="masterDataSource"` + ` |
| 測試替換 | 測試環境需替換為 Mock Bean | 測試配置檔定義 ` |
XML 之外,`@Bean` 註解的 `name` 屬性天然支援多別名:
@Configuration
public class AppConfig {
@Bean(name = {"helloWorld3", "abc", "測試"})
public HelloWorld helloWorld() {
return new HelloWorld();
}
}
等價於 XML 中定義一個 `id="helloWorld3"` + 兩個 `
完整示例專案(含 XML 與註解雙版本):
https://github.com/leechenxiang/maven-spring001-helloworld
Spring Bean 別名機制看似簡單,實則是解耦命名依賴、支援平滑遷移、適應多團隊協作的利器。善用 `