ApplicationContextAware 是 Spring 提供的回调接口,用于在 Bean 初始化后自动注入 ApplicationContext;其实现类需重写 setApplicationContext() 方法保存上下文引用,仅对单例 Bean 保证执行一次,且要求 Bean 必须由 Spring 容器管理。

ApplicationContextAware 是 Spring 提供的一个回调接口,用于让 Bean 在初始化完成后,自动获得当前 ApplicationContext 的引用。它不依赖于 XML 配置或特定注解(如 @Autowired),而是通过 Spring 容器在 Bean 创建后主动调用其 setApplicationContext() 方法来完成注入。
实现 ApplicationContextAware 接口
只需让目标类实现 ApplicationContextAware 接口,并重写 setApplicationContext(ApplicationContext ctx) 方法:
- Spring 容器在完成该 Bean 的属性填充和初始化后,会检测是否实现了该接口
- 如果实现,则调用该方法,把当前上下文对象传入
- 你可以在该方法中保存上下文引用,后续用于获取其他 Bean、发布事件、获取环境配置等
示例代码:
public class MyService implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void doSomething() {
// 按需从上下文中获取其他 Bean
UserService userService = applicationContext.getBean(UserService.class);
userService.process();
}
}
注意 Bean 的作用域和生命周期
该回调只对单例(Singleton)Bean 保证执行一次;如果是原型(Prototype)Bean,每次创建都会触发回调:
立即学习“Java免费学习笔记(深入)”;
- 确保你的类是 Spring 管理的 Bean(例如加了
@Component或在配置中声明) - 不要在
setApplicationContext()中执行耗时或阻塞操作,避免影响容器启动 - 避免循环依赖:比如在回调中立即调用另一个也依赖本 Bean 的组件
替代方案:更推荐使用构造器或 @Autowired
虽然 ApplicationContextAware 可用,但多数场景下建议优先使用更明确、可测试性更好的方式:
- 构造器注入:直接将所需 Bean 作为构造参数,语义清晰且不可变
-
@Autowired ApplicationContext context:在字段或 setter 上直接注入上下文(需确保类本身是 Spring Bean) - 若只是想获取某个特定 Bean,直接
@Autowired更安全、更易 mock 测试
常见问题:为什么 setApplicationContext 没被调用?
可能原因包括:
- 类未被 Spring 扫描到(缺少
@Component或未注册为 Bean) - 手动 new 出的对象(绕过了 Spring 容器,不会触发任何 Aware 回调)
- Bean 被
@Lazy延迟加载,且尚未被首次访问(回调会在首次使用时触发) - 实现了多个 Aware 接口,但抛出了未捕获异常,导致后续回调中断


















