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 返回的是代理對象,實現了目標接口,可安全強轉。
getBean,降低耦合,便於測試。context.getBean(UserService.class) 避免名稱硬編碼。@Lazy Bean 首次獲取時初始化。| 異常 | 原因 | 解決 |
|---|---|---|
| NoSuchBeanDefinitionException | 容器中無該 Bean | 檢查 @Component/@Service 掃描路徑、配置文件 |
| NoUniqueBeanDefinitionException | 多個同類型 Bean | 指定名稱 @Qualifier("name") 或按名稱獲取 |
| BeanNotOfRequiredTypeException | 類型不匹配 | 檢查接口/實現類繼承關係、泛型擦除 |
理解 ApplicationContext.getBean() 返回代理對象實現接口,封裝統一工具類簡化非托管場景調用,優先依賴注入而非手動查找。