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

    BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,其中有两个接口,postProcessBeanDefinitionRegistry是BeanDefinitionRegistryPostProcessor自带的,postProcessBeanFactory是从BeanFactoryPostProcessor继承过来的。postProcessBeanDefinitionRegistry是在所有Bean定义信息将要被加载,Bean实例还未创建的时候执行,优先postProcessBeanFactory执行。下面举例:

    1. 实现类

    /**
     * @author 70KG
     * @Title: MyBeanDefinitionRegistryPostProcessor
     * @Description: BeanDefinitionRegistryPostProcessor实现类
     * @date 2018/12/24 9:43 PM
     * @From www.nmyswls.com
     */
    public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
        // --- 此方法在所有Bean定义将要被加载,Bean实例还未创建的时候运行,它优先于postProcessBeanFactory方法执行。
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            System.out.println("---->postProcessBeanDefinitionRegistry容器中BeanDefinition的数量为:" + registry.getBeanDefinitionCount());
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Dog.class);
            // 还可以这样给容器中注册Bean AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
            registry.registerBeanDefinition("dog", beanDefinition);
        }
    
        // 从BeanFactoryPostProcessor继承过来的接口
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("====>postProcessBeanFactory容器中BeanDefinition的数量为:" + beanFactory.getBeanDefinitionCount());
        }
    }

    2. 配置类

    /**
     * @author 70KG
     * @Title: MyConfig
     * @Description:
     * @date 2018/12/249:46 PM
     * @From www.nmyswls.com
     */
    @Configuration
    public class MyConfig {
    
        @Bean
        public Cat cat() {
            return new Cat();
        }
    
        @Bean
        public MyBeanDefinitionRegistryPostProcessor myBeanDefinitionRegistryPostProcessor() {
            return new MyBeanDefinitionRegistryPostProcessor();
        }
    
    }

    3. 测试类

    /**
     * @author 70KG
     * @Title: Test01
     * @Description:
     * @date 2018/12/249:45 PM
     * @From www.nmyswls.com
     */
    public class Test01 {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        }
    
    }

    4. 结果

    ---->postProcessBeanDefinitionRegistry容器中BeanDefinition的数量为:9
    ====>容器中BeanDefinition的数量为:10
    。。。。Cat无参构造方法执行了。。。。
  • 相关阅读:
    SVN增加文件后,文件无法自动包括在项目中的原因
    关于浏览器和IIS基础的简单理解
    关联查询之速度优化
    <>这个符号表示泛型的意思
    傅里叶变换
    distinct和group by的性能比较
    VS2010 代码前出现虚线
    SQL的 like 中间字符通配 用法
    模态对话框中的window.close关闭时会打开新页面
    最大差值
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/10171537.html
Copyright © 2011-2022 走看看