applicationcontextaware 是 spring 提供的回调接口,用于让 bean 在初始化后自动获取 applicationcontext 实例;需实现接口、重写 setapplicationcontext 方法并确保类被 spring 管理。

在 Spring 中,ApplicationContextAware 是一个回调接口,用于让 Bean 在初始化时自动获取当前的 ApplicationContext 实例。它不依赖注入,而是由 Spring 容器在 Bean 创建完成后主动调用其 setApplicationContext() 方法完成赋值。
实现 ApplicationContextAware 的基本步骤
只需三步即可完成:
- 让目标类实现
org.springframework.context.ApplicationContextAware接口 - 重写
setApplicationContext(ApplicationContext ctx)方法,并保存上下文引用(如赋值给成员变量) - 确保该类是被 Spring 管理的 Bean(通过
@Component、@Service等注解或 XML 配置声明)
典型代码示例
以下是一个常见的实现方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<font color="#0066cc">@Component</font>
public class MyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void doSomething() {
// 使用 applicationContext 获取其他 Bean 或执行容器操作
UserService userService = applicationContext.getBean(UserService.class);
userService.save(new User());
}
}
注意事项与常见问题
使用过程中需注意几个关键点:
- 线程安全:ApplicationContext 是线程安全的,但你自己保存的引用若被多线程共享并修改(比如重新赋值),需自行保证安全
-
避免循环依赖:不要在
setApplicationContext中立即调用可能触发本 Bean 再次初始化的方法(例如 getBean(this.getClass())) -
替代方案更推荐:Spring 4.3+ 支持构造器注入
ApplicationContext,语义更清晰、测试更友好:<font color="#0066cc">@Component</font> public class MyBean { private final ApplicationContext applicationContext; public MyBean(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } } -
非 Bean 类无法生效:如果类未被 Spring 托管(比如 new 出来的对象),
setApplicationContext不会被调用,该机制完全失效
为什么能自动回调?
Spring 容器在实例化并完成属性填充后,会检查 Bean 是否实现了 ApplicationContextAware、BeanFactoryAware 等 Aware 接口。若实现,则调用对应方法传入容器实例。这个过程由 ApplicationContextAwareProcessor 处理,属于 Spring 内置的“感知机制”之一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










