更多文章点击--spring源码分析系列

主要分析内容:

一、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配置类 .

spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

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 }
CustomBeanDefinitionRegistry.java

相关文章: