spring通过aware接口家族在bean初始化早期由容器主动回调setxxx()方法注入资源:applicationcontextaware获取完整上下文,beanfactoryaware提供轻量访问,beannameaware等获取运行时信息,所有回调均发生在initializebean早期阶段。

Spring 通过 Aware 接口家族 让 Bean 在初始化早期自动获取容器内部资源,不需要手动查找或强依赖上下文。核心不是“调用接口”,而是实现特定 Aware 接口后,由 Spring 容器主动回调 setXxx() 方法注入对应对象。
感知容器上下文:ApplicationContextAware
这是最常用的方式,适用于需要跨 Bean 协作、发布事件、读取配置、国际化等场景:
- 实现
ApplicationContextAware接口,重写setApplicationContext(ApplicationContext context) - Spring 在 Bean 初始化阶段(早于
InitializingBean.afterPropertiesSet()和自定义init-method)自动调用该方法 - 注入的是完整功能的
ApplicationContext,它继承自BeanFactory,支持事件、环境、资源加载等高级能力
轻量级容器访问:BeanFactoryAware
适合仅需按名称/类型获取 Bean 或检查 Bean 定义的场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现
BeanFactoryAware接口,重写setBeanFactory(BeanFactory beanFactory) - 比
ApplicationContextAware更底层,不支持事件、环境、国际化等功能 - 在非 Web 环境或嵌入式容器中更稳定,依赖更少
获取运行时上下文信息
用于日志标记、动态注册、条件初始化等感知类逻辑:
-
BeanNameAware:重写setBeanName(String name),拿到该 Bean 在容器中的 ID 或别名 -
BeanClassLoaderAware:重写setBeanClassLoader(ClassLoader classLoader),获取当前 Bean 所属 ClassLoader,对多模块、热部署场景很关键 -
EnvironmentAware:重写setEnvironment(Environment env),读取@Profile、@Value、外部配置项 -
ResourceLoaderAware:重写setResourceLoader(ResourceLoader resourceLoader),加载classpath:/、file:、http:等资源路径
其他实用感知能力
按需选择,全部由容器统一管理生命周期和注入时机:
-
MessageSourceAware→ 获取MessageSource,做多语言文案解析,如getMessage("login.success", null, Locale.CHINA) -
ApplicationEventPublisherAware→ 获取ApplicationEventPublisher,发布自定义事件并触发监听器 -
ResourceLoaderAware已覆盖资源加载,ServletConfigAware和ServletContextAware仅在 Web 环境生效
所有 Aware 回调都发生在 AbstractAutowireCapableBeanFactory.initializeBean() 的早期阶段,早于 BeanPostProcessor 和初始化方法。这不是靠反射硬编码查找,而是容器内置的标准化回调机制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










