zoukankan      html  css  js  c++  java
  • (二)扩展原理:【2】BeanDefinitionRegistryPostProcessor

    一、BeanDefinitionRegistryPostProcessor 接口

      BeanDefinitionRegistryPostProcessor 继承结构:

    BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
      void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry);
    }

       

      执行时机
        在所有bean定义信息将要被加载,bean实例还未创建的;
      作用
        优先于 BeanFactoryPostProcessor 执行;
        利用 BeanDefinitionRegistryPostProcessor 给容器中再额外添加一些组件;

    二、案例

      1、自定义 BeanDefinitionRegistryPostProcessor 实现类

    @Component
    public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
        /*
        BeanDefinitionRegistry
            Bean 定义信息的保存中心,以后BeanFactory 就是按照 BeanDefinitionRegistry 里面保存的每一个 bean 定义信息创建 bean 的实例;
         */
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry,bean的数量:" + registry.getBeanDefinitionCount());
            //方式一:
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class);
            registry.registerBeanDefinition("blue001", beanDefinition);
    
            //方式二:
            AbstractBeanDefinition beanDefinition02 = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
            registry.registerBeanDefinition("blue002", beanDefinition02);
        }
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory");
            System.out.println("bean的数量:" + beanFactory.getBeanDefinitionCount());
        }
    }

      2、加入配置类中

    @ComponentScan(value = {"com.njf.ext", "com.njf.bean"})
    @Configuration
    public class ExtConfig {
    
        @Bean
        public Blue Blue() {
            return new Blue();
        }
    }

      3、测试

        @Test
        public void test01() {
            AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(ExtConfig.class);
    
            System.out.println("IOC容器创建完毕!");
    
            ioc.close();
        }

      运行结果:

    三、Debug

    四、小结

      BeanDefinitionRegistryPostProcessor接口:

    BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor{
        postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry);
    }
    

      


      执行时机
        在所有bean定义信息将要被加载,bean实例还未创建的;
      作用
        优先于 BeanFactoryPostProcessor 执行;
        利用 BeanDefinitionRegistryPostProcessor 给容器中再额外添加一些组件;

      原理
        (1)ioc容器创建
        (2)refresh() —> invokeBeanFactoryPostProcessors(beanFactory);
        (3)从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。
          ① 依次触发所有的postProcessBeanDefinitionRegistry()方法
          ② 再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;

        (4)再来从容器中找到BeanFactoryPostProcessor组件;然后依次触发postProcessBeanFactory()方法

  • 相关阅读:
    最近的一些心理活动
    object_c函数多个返回值
    nslayoutConstraint
    判断一些常用的东西
    color 的一些处理
    最近的心理活动
    加载不同的nib文件
    Be a person
    按钮居左显示
    SQLite错误码
  • 原文地址:https://www.cnblogs.com/niujifei/p/15560703.html
Copyright © 2011-2022 走看看