文章目录
本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git
1 BeanFactoryPostProcessor
BeanFactoryPostProcessor组件跟BeanPostProcessor组件有点类似,前面的博客我们知道了BeanPostProcessor组件的作用是在bean创建初始化前后处理。那么BeanFactoryPostProcessor组件的执行时机是在什么时候呢?我们下面看一下源码
1.2 代码测试
/**
* @description:
* @author: sukang
* @date: 2020-03-05 15:46
*/
public class Blue {
public Blue() {
System.out.println("Blue组件创建...");
}
}
/**
* @description:
* @author: sukang
* @date: 2020-03-14 9:01
*/
@ComponentScan("com.wolfx.ext")
@Configuration
public class ExtConfig {
@Bean
public Blue blue(){
return new Blue();
}
}
/**
* @description:
* @author: sukang
* @date: 2020-03-14 9:02
*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory()方法执行...");
//获取容器中所有bean定义信息名
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
}
}
写个测试用例
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
}
测试结果
1.2 源码分析
创建IOC容器,刷新容器
invokeBeanFactoryPostProcessors(beanFactory)
下面我们看一下invokeBeanFactoryPostProcessors(beanFactory)方法里面做了什么操作
2 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor组件继承了BeanFactoryPostProcessor组件
看看BeanDefinitionRegistryPostProcessor的源码
2.1 代码测试
在上面的代码基础上加一个MyBeanDefinitionRegistryPostProcessor的组件实现BeanDefinitionRegistryPostProcessor 接口
/**
* @description:
* @author: sukang
* @date: 2020-03-14 10:41
*/
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry()方法执行...");
int cout = registry.getBeanDefinitionCount();
System.out.println("容器中定义了"+ cout +"个组件");
RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class);
registry.registerBeanDefinition("Blue", beanDefinition);
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory()方法执行...");
int cout = beanFactory.getBeanDefinitionCount();
System.out.println("容器中定义了"+ cout +"个组件");
}
}
测试结果
2.2源码分析
3 总结
BeanFactoryPostProcessor是BeanFactory的后置处理器。作用及执行时间为:
作用:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容
执行时机:所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor。作用及执行时间为:
作用:给容器中再额外添加一些组件
执行时机:在所有bean定义信息将要被加载,bean实例还未创建的,优先于BeanFactoryPostProcessor执行