全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 6 分钟 ✍️ juanwangdev

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接口注入资源
EnvironmentAwareEnvironment对象
ResourceLoaderAwareResourceLoader(ApplicationContext本身)
ApplicationEventPublisherAware事件发布器(ApplicationContext本身)
MessageSourceAware消息源(ApplicationContext本身)
ApplicationContextAwareApplicationContext实例

执行流程

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接口处理位置
BeanNameAwareBeanFactory
BeanFactoryAwareBeanFactory
ApplicationContextAwareApplicationContextAwareProcessor
EnvironmentAwareApplicationContextAwareProcessor
ResourceLoaderAwareApplicationContextAwareProcessor

实际意义

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直接处理
  • 容器启动时自动注册,无需手动配置

📝 发现内容有误?点击此处直接编辑

← 上一篇 声明式事务与编程式事务
下一篇 → ApplicationListener 和 ApplicationEvent
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库