ApplicationContextAwareProcessor
ApplicationContextAwareProcessor处理Aware接口的回调逻辑。
类定义
Java
class ApplicationContextAwareProcessor implements BeanPostProcessor {
private final ConfigurableApplicationContext applicationContext;
public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
invokeAwareInterfaces(bean);
return bean;
}
private void invokeAwareInterfaces(Object bean) {
// 处理各种Aware接口
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(
this.applicationContext.getEnvironment());
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(
this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(
this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(
this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(
this.applicationContext);
}
}
}
处理的Aware接口
| Aware接口 | 注入资源 |
|---|---|
| EnvironmentAware | Environment对象 |
| ResourceLoaderAware | ResourceLoader(ApplicationContext本身) |
| ApplicationEventPublisherAware | 事件发布器(ApplicationContext本身) |
| MessageSourceAware | 消息源(ApplicationContext本身) |
| ApplicationContextAware | ApplicationContext实例 |
执行流程
Java
┌─────────────────────────────────────┐
│ Bean实例化 │
├─────────────────────────────────────┤
│ 属性注入 │
├─────────────────────────────────────┤
│ ApplicationContextAwareProcessor │
│ .postProcessBeforeInitialization │
│ → invokeAwareInterfaces │
│ → 回调Aware接口方法 │
├─────────────────────────────────────┤
│ 其他BeanPostProcessor │
├─────────────────────────────────────┤
│ @PostConstruct │
└─────────────────────────────────────┘
注册时机
Java
// AbstractApplicationContext.prepareBeanFactory()
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 注册ApplicationContextAwareProcessor
beanFactory.addBeanPostProcessor(
new ApplicationContextAwareProcessor(this));
}
在容器启动时自动注册,无需手动配置。
源码解析
Java
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
// EnvironmentAware
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(
this.applicationContext.getEnvironment());
}
// ResourceLoaderAware - ApplicationContext实现ResourceLoader
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(
this.applicationContext);
}
// ApplicationEventPublisherAware - ApplicationContext实现Publisher
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(
this.applicationContext);
}
// MessageSourceAware - ApplicationContext实现MessageSource
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(
this.applicationContext);
}
// ApplicationContextAware
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(
this.applicationContext);
}
}
}
注意事项
Java
// 不处理BeanFactoryAware和BeanNameAware
// 这两个由其他处理器处理:
// - BeanNameAware: 由BeanFactory直接处理
// - BeanFactoryAware: 由BeanFactory直接处理
// 内部Bean不会被处理
// 如果Bean是Spring内部基础设施Bean(如BeanPostProcessor本身),
// 会跳过Aware处理以避免循环依赖
BeanFactory对比
| Aware接口 | 处理位置 |
|---|---|
| BeanNameAware | BeanFactory |
| BeanFactoryAware | BeanFactory |
| ApplicationContextAware | ApplicationContextAwareProcessor |
| EnvironmentAware | ApplicationContextAwareProcessor |
| ResourceLoaderAware | ApplicationContextAwareProcessor |
实际意义
text
// Bean只需实现Aware接口,自动获取资源
@Component
public class MyService implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) {
// ApplicationContextAwareProcessor自动调用此方法
this.context = context;
}
}
ApplicationContextAwareProcessor让Aware机制透明化,开发者只需实现接口即可。
要点总结
- ApplicationContextAwareProcessor是内置BeanPostProcessor
- 在postProcessBeforeInitialization中回调Aware接口
- 处理Environment/ResourceLoader/EventPublisher/MessageSource/Context相关Aware
- BeanNameAware和BeanFactoryAware由BeanFactory直接处理
- 容器启动时自动注册,无需手动配置
📝 发现内容有误?点击此处直接编辑