Spring源码-BeanDefinitionRegistryPostProcessor

作用:用于动态的生成BeanDefinition,因为无论是xml还是注解都是通过配置静态的生成BeanDefinition并且注册到容器中。我们可以通过实现BeanDefinitionRegistryPostProcessor接口来动态的生成、注册Bean。
原理:

  • 实现BeanDefinitionRegistryPostProcessor接口,并且注入到容器中;
  • 执行过程:在ApplicationContext的Refresh()方法中,会调用invokeBeanFactoryPostProcessors方法会调用容器中所有实现了BeanDefinitionRegistryPostProcessor接口的类的postProcessBeanDefinitionRegistry方法,在该方法中我们可以动态的创建、注册bean见下面的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     @Component
    public class RegistryDemo implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
    GenericBeanDefinition definition = new GenericBeanDefinition();
    definition.setBeanClass(Demo.class); //设置类
    definition.setScope("singleton"); //设置scope
    definition.setLazyInit(false); //设置是否懒加载
    definition.setAutowireCandidate(true); //设置是否可以被其他对象自动注入
    beanDefinitionRegistry.registerBeanDefinition("demo", definition);
    }
    //省略其他代码
    }