首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring AliasRegistry 介面詳解:Bean 別名註冊與查詢機制

     編輯:Java 綜合教學

AliasRegistry 介面定義

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);
}

實作類別體系

  • SimpleAliasRegistry:預設實作,使用 ConcurrentHashMap<String, String> 維護 alias -> canonicalName 映射,執行緒安全。
  • DefaultListableBeanFactory:繼承 SimpleAliasRegistry,同時實作 BeanDefinitionRegistry,是 Spring IoC 容器的核心實作。

典型使用場景

  1. XML 多 id 別名:<bean id="dataSource" name="ds, jdbc/dataSource" .../>,容器啟動時自動調用 registerAlias("dataSource", "ds")。
  2. @Bean name 屬性:@Bean({"dataSource", "ds"}) 產生同樣效果。
  3. 外部化配置綁定:JNDI 名稱、環境變數映射到 Bean 名稱。
  4. 動態別名註冊: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]。
  • 父子容器隔離:子容器可覆蓋父容器別名,查詢遵循委派模型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved