org.springframework.beans.factory.support.AliasRegistry 是 Spring 容器管理 Bean 別名的核心契約,定義於 Spring 4.2.3 版本。它提供註冊、移除、查詢別名的基本操作,是 BeanDefinitionRegistry 的父介面之一。
public interface AliasRegistry {
/** 將 name 註冊為 alias 的別名 */
void registerAlias(String name, String alias);
/** 移除指定的別名 */
void removeAlias(String alias);
/** 判斷 name 是否曾被註冊過別名 */
boolean isAlias(String name);
/** 獲取 name 註冊的所有別名,若無則回傳空陣列 */
String[] getAliases(String name);
}
ConcurrentHashMap<String, String> 維護 alias -> canonicalName 映射,執行緒安全。SimpleAliasRegistry,同時實作 BeanDefinitionRegistry,是 Spring IoC 容器的核心實作。<bean id="dataSource" name="ds, jdbc/dataSource" .../>,容器啟動時自動調用 registerAlias("dataSource", "ds")。@Bean({"dataSource", "ds"}) 產生同樣效果。BeanFactoryPostProcessor 中根據條件註冊別名,實現多環境切換。// SimpleAliasRegistry 核心片段
private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
@Override
public void registerAlias(String name, String alias) {
Assert.hasText(name, "'name' must not be empty");
Assert.hasText(alias, "'alias' must not be empty");
synchronized (this.aliasMap) {
if (alias.equals(name)) {
this.aliasMap.remove(alias);
return;
}
String registeredName = this.aliasMap.get(alias);
if (registeredName != null) {
if (registeredName.equals(name)) return; // 已存在相同映射
throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" + name + "': already registered for '" + registeredName + "'.");
}
checkForAliasCircle(name, alias); // 防止循環別名
this.aliasMap.put(alias, name);
}
}
@Override
public String[] getAliases(String name) {
List<String> result = new ArrayList<>();
synchronized (this.aliasMap) {
retrieveAliases(name, result);
}
return StringUtils.toStringArray(result);
}
A -> B, B -> C,getAliases("C") 回傳 [A, B]。