• 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>

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

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

     

     

     

     

     

     

     

     

      

  • 相关阅读:
    PTA L2-026 小字辈 (25分)
    Python自学-day36(前端框架--VUE)
    WebGoat教程学习(七)--XPATH 注入(XPATH-Injection)
    WebGoat教程学习(六)--日志欺骗(Log Spoofing)
    WebGoat教程学习(五)--并发(Concurrency)
    WebGoat教程学习(四)--代码质量
    WebGoat教程学习(三)--Ajax安全
    WebGoat教程学习(二)--文件权限控制
    WebGoat教程学习(一)--环境配置
    Java排错随笔
  • 原文地址:https://www.cnblogs.com/dengrong/p/10829286.html
Copyright © 2020-2023  润新知