Spring中可通过ApplicationContext手动获取Bean,但仅适用于工具类等特殊场景;推荐按类型或名称+类型调用getBean(),需确保上下文可用且注意作用域与生命周期。

在 Spring 中,可以通过 ApplicationContext 手动获取 Bean,但需注意:这不是推荐的常规用法,仅适用于特殊场景(如工具类、静态上下文访问、第三方框架集成等)。核心方式是调用 getBean() 方法。
使用 getBean() 按类型或名称获取 Bean
ApplicationContext 提供了多种重载的 getBean() 方法:
-
按类型获取(推荐):
context.getBean(YourService.class)—— 类型必须唯一,否则抛出NoUniqueBeanDefinitionException -
按名称 + 类型获取(最安全):
context.getBean("yourService", YourService.class)—— 明确指定 bean 名称和类型,避免歧义 -
仅按名称获取(不推荐):
context.getBean("yourService")—— 返回Object,需强制转型,易出ClassCastException
确保 ApplicationContext 可用
手动获取的前提是已持有有效的 ApplicationContext 实例。常见方式有:
- 在 Spring 管理的 Bean 中通过
@Autowired注入:@Autowired private ApplicationContext context; - 实现
ApplicationContextAware接口,在setApplicationContext()中保存引用(适合非 Bean 类初始化时使用) - 通过
SpringApplication.run()的返回值获取:ApplicationContext context = SpringApplication.run(App.class, args);
注意作用域与生命周期
手动调用 getBean() 不改变 Bean 的作用域行为:
立即学习“Java免费学习笔记(深入)”;
- Singleton(默认):每次获取都是同一个实例
- Prototype:每次调用都创建新实例,需确保业务逻辑能处理多实例
- 若 Bean 是懒加载(
@Lazy),首次getBean()才会触发初始化
替代方案更符合 Spring 设计理念
优先考虑依赖注入而非手动获取:
- 用
@Autowired、@Resource或构造器注入代替getBean() - 需要动态选择 Bean 时,可用
ObjectProvider<YourService>或ListableBeanFactory查找多个候选 - 工具类中确实需全局访问时,可封装一个静态工具类(配合
ApplicationContextAware初始化),但要确保线程安全和上下文可用性


















