主要分析内容:
一、BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor简述与demo示例
二、BeanFactoryPostProcessor源码分析:注册时机和触发点
(源码基于spring 5.1.3.RELEASE分析)
一、BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor简述与demo示例
1、BeanFactoryPostProcessor是spring容器级别的拓展接口,是在BeanDefinition加载完成之后,未实例化之前.可以拓展接口,对定制化修改BeanDefinition.
1 public interface BeanFactoryPostProcessor { 2 3 void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; 4 }
2、BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,是一种比较特殊的BeanFactoryPostProcessor。
BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法可实现自定义的bean注册定义。
通常spring注册bean使用静态方式, 如:xml、@Bean注解或@Component方式实现注册.不能通过程序来选择是否注册。
而实现BeanDefinitionRegistryPostProcessor的类可以获得BeanDefinitionRegistry 对象,通过它可以动态的注册组件,是实现动态注册的钩子函数。spring典型的ConfigurationClassPostProcessor拓展BeanDefinitionRegistryPostProcessor 解析@Configuration配置类 .
1 public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { 2 3 void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; 4 }
demo示例:
1 public class CustomBeanDefinitionRegistry implements BeanDefinitionRegistryPostProcessor { 2 3 @Override 4 public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 5 GenericBeanDefinition definition = new GenericBeanDefinition(); 6 //设置类 7 definition.setBeanClass(RegistryBean.class); 8 //设置scope 9 definition.setScope("singleton"); 10 //设置是否懒加载 11 definition.setLazyInit(false); 12 //设置是否可以被其他对象自动注入 13 definition.setAutowireCandidate(true); 14 15 // 给属性赋值 16 MutablePropertyValues mpv = new MutablePropertyValues() ; 17 mpv.add("name", "CustomBeanDefinitionRegistry settings") ; 18 definition.setPropertyValues(mpv); 19 20 registry.registerBeanDefinition("registryBean", definition); 21 } 22 23 24 @Override 25 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 26 // do noting 27 28 } 29 }