首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring Context 獲取 Bean:ApplicationContext 與 BeanFactory 使用模式

     編輯:程式設計疑難解答

代碼片段分析


ApplicationContext context = ContextHolder.getInstance().getApplicationContext();
return context.getBean(name);

核心機制

  • ContextHolder:單例持有 ApplicationContext 實例,常見於非 Spring 管理類中獲取上下文。
  • getBean(name):從容器獲取指定名稱/類型的 Bean 實例。
  • 返回類型為 Object,需強轉為目標接口/類。

標準封裝工具類


public final class BeanFactoryUtil {
    private static ApplicationContext context;
    
    // Spring 啟動時注入(實現 ApplicationContextAware)
    public static void setApplicationContext(ApplicationContext ctx) {
        context = ctx;
    }
    
    @SuppressWarnings("unchecked")
    public static  T getBean(String name) {
        return (T) context.getBean(name);
    }
    
    public static  T getBean(Class clazz) {
        return context.getBean(clazz);
    }
    
    public static  T getBean(String name, Class clazz) {
        return context.getBean(name, clazz);
    }
}

接口無實現類如何接收?

Spring 通過 JDK 動態代理 或 CGLIB 為接口生成代理對象(如 @Transactional、@Repository)。調用 getBean 返回的是代理對象,實現了目標接口,可安全強轉。

最佳實踐

  1. 優先構造器/Setter 注入:避免手動 getBean,降低耦合,便於測試。
  2. 非托管類才用工具類:如定時任務、第三方庫回調、舊代碼遷移。
  3. 按類型獲取:context.getBean(UserService.class) 避免名稱硬編碼。
  4. 懶加載考慮:@Lazy Bean 首次獲取時初始化。

常見異常

異常原因解決
NoSuchBeanDefinitionException容器中無該 Bean檢查 @Component/@Service 掃描路徑、配置文件
NoUniqueBeanDefinitionException多個同類型 Bean指定名稱 @Qualifier("name") 或按名稱獲取
BeanNotOfRequiredTypeException類型不匹配檢查接口/實現類繼承關係、泛型擦除

理解 ApplicationContext.getBean() 返回代理對象實現接口,封裝統一工具類簡化非托管場景調用,優先依賴注入而非手動查找。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved