1. 增强器分类

BeanFactoryPostProcessor

BeanPostProcessor

InitializingBean

2. BeanFactoryPostProcessor

[[MyBeanFactoryPostProcessor.java]]

2.1. 作用

beanFactory 的后置处理器,在 BeanFactory 标准初始化之后调用,用来定制和修改 BeanFactory 的内容;

2.2. 时机

所有的 bean 定义已经保存加载到 beanFactory,但是 bean 的实例还未创建

2.3. 原理

1)、ioc 容器创建对象的过程中
2)、执行 invokeBeanFactoryPostProcessors(beanFactory) 方法,遍历所有 BeanFactoryPostProcessors 执行他们的 postProcessBeanFactory 方法

如何找到所有的BeanFactoryPostProcessor并执行他们的方法?
  1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
  2)、在初始化创建其他组件方法finishBeanFactoryInitialization前面执行

3. BeanDefinitionRegistryPostProcessor

[[MyBeanDefinitionRegistryPostProcessor.java]]

3.1. 作用

利用 BeanDefinitionRegistryPostProcessor 给容器中再额外添加一些组件;

3.2. 时机

优先于 BeanFactoryPostProcessor 执行;
在所有 bean 定义信息将要被加载,bean 实例还未创建的;


3.3. 原理

1)、ioc 创建对象
2)、refresh()->invokeBeanFactoryPostProcessors(beanFactory);
3)、从容器中获取到所有的 BeanDefinitionRegistryPostProcessor 组件。
1、依次触发所有的 postProcessBeanDefinitionRegistry() 方法
2、再来触发 postProcessBeanFactory() 方法 BeanFactoryPostProcessor;

4)、再来从容器中找到 BeanFactoryPostProcessor 组件;然后依次触发 postProcessBeanFactory() 方法

3.4. 子类示例

ConfigurationClassPostProcessor

4. BeanPostProcessor

Spring-1、基本原理

bean 后置处理器,bean 创建对象初始化前后进行拦截工作的

4.1. 原理

遍历得到容器中所有的 BeanPostProcessor;挨个执行 beforeInitialization,
一但返回 null,跳出 for 循环,不会执行后面的 BeanPostProcessor.postProcessorsBeforeInitialization

给 bean 进行属性赋值之后
populateBean(beanName, mbd, instanceWrapper);

在初始化方法 invokeInitMethods 执行前后分别执行 applyBeanPostProcessorsBefore(After)Initialization 方法
initializeBean{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd); 执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

4.2. Spring 底层使用

bean 赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;

4.2.1. ApplicationContextAwareProcessor


4.2.2. InitDestroyAnnotationBeanPostProcessor

处理 @PostConstruct@PreDestroy 的 BeanPostProcessor

4.2.3. AutowiredAnnotationBeanPostProcessor

5. InitializingBean

5.1. 作用

Bean 组件初始化以后对组件进行后续设置;在于额外处理

1
void afterPropertiesSet() throws Exception;

5.2. 时机

5.3. 原理

5.4. 使用

6. SmartInstantiationAwareBeanPostProcessor

6.1. 注册监听器时调用

6.2. 创建实例时调用

7. AutowiredAnnotationBeanPostProcessor

8. ApplicationListener

[[ExtConfig.java]]

8.1. 使用

  1. 写一个监听器(ApplicationListener 实现类)来监听某个事件(ApplicationEvent 及其子类)
  2. 在被 Spring 管理起来的 service 中使用注解 @EventListener

8.2. 原理

8.2.1. 事件来源

1)、ContextRefreshedEvent 事件:
1)、容器创建对象:refresh();
2)、finishRefresh(); 容器刷新完成会发布 ContextRefreshedEvent 事件
2)、自己发布事件;
3)、容器关闭会发布 ContextClosedEvent;

8.2.2. 初始化事件多播器(派发器)

1)、容器创建对象:refresh();
2)、initApplicationEventMulticaster(); 初始化 ApplicationEventMulticaster;
1)、先去容器中找有没有 id=“applicationEventMulticaster”的组件;
2)、如果没有 this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个 applicationEventMulticaster;

8.2.3. 容器注册监听器

1)、容器创建对象:refresh();
2)、registerListeners();
从容器中拿到所有的监听器,把他们注册到 applicationEventMulticaster 中;
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
//将 listener 注册到 ApplicationEventMulticaster 中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

8.2.4. 发布流程

publishEvent(new ContextRefreshedEvent(this));

1)、获取事件的多播器(派发器):getApplicationEventMulticaster()
2)、multicastEvent 派发事件:
3)、获取到所有的 ApplicationListener;
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
1)、如果有 Executor,可以支持使用 Executor 进行异步派发;
Executor executor = getTaskExecutor();
2)、否则,同步的方式直接执行 listener 方法;invokeListener(listener, event);
拿到 listener 回调 onApplicationEvent 方法;

8.2.5. @EventListener 注解原理

使用 EventListenerMethodProcessor 处理器来解析方法上的@EventListener;
EventListenerMethodProcessor 实现了 SmartInitializingSingleton 接口
SmartInitializingSingleton 原理:->afterSingletonsInstantiated();
1)、ioc 容器创建对象并 refresh();
2)、AbstractApplicationContext.finishBeanFactoryInitialization(beanFactory); 初始化剩下的单实例 bean;
在 beanFactory.preInstantiateSingletons() 中
1)、先创建所有的单实例 bean;getBean();
2)、获取所有创建好的单实例 bean,判断是否是 SmartInitializingSingleton 类型的;
如果是就调用 afterSingletonsInstantiated();

在 this.processBean(factories, beanName, type) 中会 this.applicationContext.addApplicationListener(applicationListener);
将@EventListener 标注的 Listener 加入到容器中

8.2.6. BeanFactory 和 ApplicationContext

9. 实战经验

10. 参考与感谢

Spring-1、基本原理