BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作
* 1)、BeanFactoryPostProfessor:beanFactory后置处理器
* 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容
* 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
* 在实例化bean时,是先往容器中添加bean定义,但是都未实例化
* 1.创建i o c容器
* 2.invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor
* 如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
* 1.直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法;(这个BeanFactory是以后的ioc容器)
* 2.在初始化创建其他组件之前执行
* 2)、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
* postProcessBeanDefinitionRegistry()
* 在所有bean定义将要加载,bean实例还未创建的时候执行;
*
* 优于BeanFactoryPostProcessor执行;
* 利于BeanDefinitionRegistryPostProcessor给容器中添加额外的组件
*
*
* 原理:
* 1.创建ioc容器
* 2.refresh()==>invokeBeanFactoryPostProcessors(beanFactory)
* 3.先从容器中获取BeanDefinitionRegistryPostProcessor类型的组件,同时也会通过过滤获取到BeanFactoryPostProcessor组件
* 1. 先依次触发postProcessBeanDefinitionRegistry()方法【BeanDefinitionRegistryPostProcessor】
* currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
* 同时还通过调用getBean(),依次往容器中注入实例化的bean【BeanDefinitionRegistryPostProcessor】
* 根据优先级,依次触发postProcessBeanDefinitionRegistry();
* 2. 再来依次触发postProcessBeanFactory()方法【BeanFactoryPostProcessor】
* 4.再来从容器中找 BeanFactoryPostProcessor的组件,依次触发postProcessBeanFactory()方法(在执行完postProcessBeanDefinitionRegistry之后就开始了)
* 同时还依次往容器中注入实例化的bean【BeanFactoryPostProcessor】
*
BeanPostProcessor 原理及源码分析
最新推荐文章于 2023-03-22 23:09:15 发布