title: Spring回调接口Aware-源码分析
date: 2020-04-24 21:37:27
tags:
Spring
提供了一种机制,让bean
在实例化的时候,能够感知(获取)容器中的一些组件,即Aware接口回调的方式。这种机制一般是Spring
框架内部使用。
Aware | z作用 |
---|---|
BeanFactoryAware | 获取当前 BeanFactory,这样可以调用容器的服务 |
ApplicationContextAware | t同BeanFactory |
MessageSourceAware | 获取 Message Source 相关文本信息 |
ApplicationEventPublisherAware | 发布事件 |
ResourceLoaderAware | 获取资源加载器,这样获取外部资源文件 |
BeanNameAware | 获取容器中 Bean 的名称 |
示例
@Component
public class AwareTest implements ApplicationContextAware , BeanNameAware {
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("取得applicationContext。。。。");
}
public void setBeanName(String name) {
System.out.println(name);
}
}
原理
在这些Aware中,底层实现主要分为两种:
-
invokeAwareMethods(beanName, bean);
-
BeanPostProcessor
(1)invokeAwareMethods(beanName, bean);
在创建bean
的核心方法initializeBean
中,创建好bean
后,都会先调用invokeAwareMethods(beanName, bean);
,再进行初始化。
若这个bean
为一个Aware
,就去尝试调用一些回调方法。
在这个方法中,有三种Aware
会在这个方法中被调用:BeanNameAware
、BeanClassLoaderAware
、BeanFactoryAware
。
//
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware)