导航菜单

BeanPostProcessor后置处理器原理以及ApplicationListener原理

BeanPostProcessor:bean后处理器,bean创建对象在初始化之前和之后被截获。

1,BeanFactoryPostProcessor:BeanFactory后处理器;

在BeanFactory标准初始化后调用;所有bean定义都已保存并加载到BeanFactory中,但尚未创建bean实例;

BeanFactoryPostProcessor原则:

1.1 ioc容器创建对象

1.2 invokeBeanFactoryPostProcessors(BeanFactory);执行BeanFactoryPostProcessor;

如何找到所有BeanFactoryPostProcessors并执行他们的方法;

1.2.1直接在BeanFactory中查找BeanFactoryPostProcessor的所有组件并执行它们的方法

1.2.2在初始化其他组件之前执行

2,BeanDefinitionRegistryPostProcessor扩展BeanFactoryPostProcessor

postProcessBeanDefinitionRegistry();

在将加载所有bean定义信息时,尚未创建bean实例;

优先执行BeanFactoryPostProcessor;

使用BeanDefinitionRegistryPostProcessor将其他组件添加到容器中;

原理:

2.1,ioc创建对象

2.2,refresh() - > invokeBeanFactoryPostProcessors(beanFactory);

2.3,从容器中获取BeanDefinitionRegistryPostProcessor组件。

2.3.1依次触发所有postProcessBeanDefinitionRegistry()方法

2.3.2然后触发postProcessBeanFactory()方法BeanFactoryPostProcessor;

2.4,然后从容器中找到BeanFactoryPostProcessor组件;然后依次触发postProcessBeanFactory()方法

3,ApplicationListener:侦听容器中发布的事件。事件驱动的模型开发;

公共接口ApplicationListener

听取下面的ApplicationEvent及其子事件;

步骤进行:

1.编写一个监听器来监听事件(ApplicationEvent及其子类)

2.将侦听器添加到容器中;

3.只要容器中有相关事件,我们就可以听取此事件;

ContextRefreshedEvent:在容器刷新完成时发布事件(所有bean都已完全创建);

ContextClosedEvent:关闭容器将发布事件;

4.发布活动;

ApplicationContext中。 publishEvent();

原理:

ContextRefreshedEvent,IOCTest_Ext $ 1 [来源=你自己的事件! ] ContextClosedEvent;

1. ContextRefreshedEvent事件:

1.1容器创建对象:refresh();

1.2 finishRefresh();当容器刷新完成时释放ContextRefreshedEvent

1.3发布事件(新的上下文刷新事件(this); [事件发布过程]

1.3.1用于获取事件的Multiwave Dispatcher:getApplication Event Multicaster()

1.3.2 MulticasterEvent调度事件:

1.3.3获取所有应用程序监听器

For(final Application Listener<> listener: get application Listeners(event,type)

1.3.3.1如果有Executor,您可以使用Executor支持异步调度;

Executor executor=getTaskExecutor();

1.3.3.2否则,同步方法直接执行监听方法; invokeListener(listener,event);

获取侦听器回调onApplicationEvent方法;

2.发布你自己的活动;

3,容器关闭将释放ContextClosedEvent

[事件多波(经销商)]

1,容器创建对象:refresh();

2,initApplicationEventMulticaster();初始化ApplicationEventMulticaster;

2.1首先转到容器,找到id='applicationEventMultcaster'的组件;

2.2如果没有this.applicationEventMulticaster=new SimpleApplicationEventMulticaster(beanFactory);

并且添加到容器中,我们可以在其他组件中调度事件,自动注入此applicationEventMulticaster;

[容器中的听众是什么]

1,容器创建对象:refresh();

2. RegiserListeners();

String [] listenerBeanNames=getBeanNamesForType(Application Listener.class,true,false);

//在Application Event Multicaster中注册监听器

GetApplication Event Multicaster()。 addApplication Listener Bean(监听器Bean名称);

包com.spring.ext;

导入组织。弹簧框架。上下文。注解。豆;

导入组织。弹簧框架。上下文。注解。 ComponentScan;

导入组织。弹簧框架。上下文。注解。配置;

导入com。弹簧。豆。红色;

http://www.whgcjx.com/bds5Vxc/F.html