zoukankan      html  css  js  c++  java
  • Spring源码窥探之:扩展原理BeanFactoryPostProcessor

    BeanPostPorcessor是在bean创建对象初始化前后进行拦截工作,而BeanFactoryPostProcessor是Bean工厂的后置处理器,在Bean定义加载完成之后,Bean实例初始化之前会调用postProcessBeanFactory方法.
    1.实现类
    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            int count = beanFactory.getBeanDefinitionCount();
            String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
            for (String str : beanDefinitionNames) {
                System.out.println("----->" + str);
            }
            System.out.println("获取容器中BeanDefinition的数量-------> " + count);
        }
    }

    2. 配置类,其中注入了一个实体类,跟一个MyBeanFactoryPostProcessor 

    /**
     * description
     *
     * @author 70KG
     * @date 2018/12/24
     */
    @Configurationpublic class MyConfig {
    
        @Bean
        public People01 people01() {
            return new People01();
        }
    
        @Bean
        public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
            return new MyBeanFactoryPostProcessor();
        }
    
    }

    3. 测试类

    public class Test01 {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        }
    
    }

    4. 结果,可见postProcessBeanFactory方法先于构造方法执行

    ----->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
    ----->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    ----->org.springframework.context.annotation.internalRequiredAnnotationProcessor
    ----->org.springframework.context.annotation.internalCommonAnnotationProcessor
    ----->org.springframework.context.event.internalEventListenerProcessor
    ----->org.springframework.context.event.internalEventListenerFactory
    ----->myConfig
    ----->people01
    ----->myBeanFactoryPostProcessor
    获取容器中BeanDefinition的数量-------> 9
    People01无参构造执行...

    BeanFactoryPostProcessor调用栈:
    1. AnnotationConfigApplicationContext类中AnnotationConfigApplicationContext构造中的refresh().尝试去刷新容器
    2. AbstractApplicationContext类中refresh()方法的invokeBeanFactoryPostProcessors(beanFactory).
    在初始化实例之前,首先对BeanFactory进行后置处理,目的就是为了在所有的Bean定义都已经加载,但还未初始化之前,向容器中
    增加属性或者重写Bean的定义信息(This allows for overriding or adding properties even to eager-initializing beans)
    3. AbstractApplicationContext类中invokeBeanFactoryPostProcessors()方法中的PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
    4. PostProcessorRegistrationDelegate类中的invokeBeanFactoryPostProcessors()方法中的invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory)
    5. PostProcessorRegistrationDelegate类中的invokeBeanFactoryPostProcessors()方法中的postProcessor.postProcessBeanFactory(beanFactory)进行回调.

  • 相关阅读:
    ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
    ACM学习历程—HDU2476 String painter(动态规划)
    ACM学习历程—BestCoder Round #75
    ACM学习历程—Hihocoder [Offer收割]编程练习赛1
    codeforces 154A 贪心
    分治 最大连续和
    二分 连续上升子序列变形 UVA1471
    POJ3614 贪心+优先队列
    Havel-Hakimi定理 POJ1659
    拓扑排序
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/10168946.html
Copyright © 2011-2022 走看看