spring注解-spring一些核心类的作用、用法(扩展原理)

一、扩展原理

1.BeanPostProcessor:  bean后置处理器,bean创建对象前后进行拦截工作,比如创建bean的代理并返回

2.BeanFactoryPostProcessor: beanFactory的后置处理器,在beanFactory标准初始化之后,可以修改

  beanFactory的内容,比如注册一个bean定义

3.BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor  它定义了一个方法:

  postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException,可以用来

  注册bean定义。

 注:3先于2调用

二、ApplicationListener

1.设计模式:观察者模式       发布中心:spring容器       观察者:监听器

  应用程序可以定义观察者,作为bean注册到容器中:实现ApplicationListener<ApplicationEvent>接口,   实现接口中的方法(收听功能):onApplicationEvent(ApplicationEvent arg0)

2.容器发布事件:ctx.publishEvent(new ApplicationEvent(""){})

3.如何做到每发布一个事件,监听器就作出响应: 

三、spring容器事件机制原理:

       1.容器刷新事件发布到监听器处理事件:

          refresh() ——>finishRefresh()——>publishEvent(new ContextRefreshedEvent(this))——>

          getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType)

          multicastEvent(applicationEvent, eventType)执行流程:

          1. 遍历监听者:getApplicationListeners(event, type),然后遍历,依次调用invokeListener(...).

             invokeListener(...)——>listener.onApplicationEvent(event) 完了

          2.multicastEvent多播事件就是把消息发给所有监听者,遍历监听者,调用它们的收听接口

             每个监听者都有一个接口接受发布中心推送的消息,相当于信箱。

       2.容器何时注册ApplicationEventMulticaster:

          refresh()——>initApplicationEventMulticaster():

          if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)),就创建

          bf.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME,ApplicationEventMulticaster.class)

          else

                new SimpleApplicationEventMulticaster(beanFactory)

          完。。。

       3.refresh()——>registerListeners()注册监听者

四、@EventListener如何工作

       1.finishBeanFactoryInitialization(beanFactory)——>beanFactory.preInstantiateSingletons()——>

          第一次遍历beanNames,初始化所有bean,第二次遍历beanNames,判断:

          如果 singletonInstance instanceof SmartInitializingSingleton,就调用SmartInitializingSingleton

          的方法smartSingleton.afterSingletonsInstantiated()。当遍历到EventListenerMethodProcessor时,

          就调用这个放法。

      2.所以@EventListener就是利用EventListenerMethodProcessor(实现SmartInitializingSingleton接口)调用

         afterSingletonsInstantiated()方法完成监听器适配器注册,适配器收到事件时反射调用适配的bean的收听

         方法完成事件响应。

      3.afterSingletonsInstantiated()方法如何工作:还是遍历beanNames,找到标有@EventListener注解的方法

    

 遍历找到的方法,EventListenerFactory.createApplicationListener(beanName, targetType, methodToUse) 

 如果创建出来的实例是ApplicationListenerMethodAdapter类型,添加到上下的监听器集合中   

 

 这里用到适配器模式:ApplicationListenerMethodAdapter 实现了ApplicationListener<ApplicationEvent>

 接口,这个接口提供了收听服务,任何一个类没有实现该接口,又想收听事件(用自己的一个方法收听),那么

 可以把这个类关联到适配器中,适配器负责收听事件,然后通知它适配的类。                     

 

 

 

 

 

 

 

 

  

posted @ 2019-05-08 05:22  ………  阅读(2301)  评论(0编辑  收藏  举报