Spring源码学习--BeanPostProcessor
2017-05-16 21:20
405 查看
BeanPostProcessor接口的作用是在Spring容器完成Bean实例化前后可以添加一些自己的逻辑处理,我们可以定义一个或者多个BeanPostProcessor接口的实现。
BeanPostProcessor接口提供了两个方法:
1、postProcessBeforeInitialization 可以对Bean在实例化之前添加一些逻辑处理
2、postProcessAfterInitialization 可以对bean在实例化之后添加一些逻辑处理
public interface BeanPostProcessor {
//可以对Bean在实例化之前添加一些逻辑处理
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//可以对bean在实例化之后添加一些逻辑处理
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
简单示例MyBeanPostProcessor:
public class MyBeanPostProcessor implements BeanPostProcessor {
//Bean 实例化之前进行的处理
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "开始实例化");
return bean;
}
//Bean 实例化之后进行的处理
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "实例化完成");
return bean;
}
}在applicationContext.xml中添加配置
<bean class="com.spring.test.di.MyBeanPostProcessor"/>
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
//获取所有实现BeanPostProcessor的实现类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
List<String> orderedPostProcessorNames = new ArrayList<String>();
List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
for (String ppName : postProcessorNames) {
if (isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
//保存所有的BeanPostProcessor
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
OrderComparator.sort(priorityOrderedPostProcessors);
//注册所有的BeanPostProcessor
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
OrderComparator.sort(orderedPostProcessors);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
OrderComparator.sort(internalPostProcessors);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
}
BeanPostProcessor接口提供了两个方法:
1、postProcessBeforeInitialization 可以对Bean在实例化之前添加一些逻辑处理
2、postProcessAfterInitialization 可以对bean在实例化之后添加一些逻辑处理
public interface BeanPostProcessor {
//可以对Bean在实例化之前添加一些逻辑处理
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//可以对bean在实例化之后添加一些逻辑处理
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
简单示例MyBeanPostProcessor:
public class MyBeanPostProcessor implements BeanPostProcessor {
//Bean 实例化之前进行的处理
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "开始实例化");
return bean;
}
//Bean 实例化之后进行的处理
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "实例化完成");
return bean;
}
}在applicationContext.xml中添加配置
<bean class="com.spring.test.di.MyBeanPostProcessor"/>
1、BeanPostProcessor保存到Spring容器
这样MyBeanPostProcessor就会添加到Spring的容器中,在Spring容器中会将所有实现BeanPostProcessor的bean保存起来,具体实现在AbstractApplicationContext的registerBeanPostProcessors中protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
//获取所有实现BeanPostProcessor的实现类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
List<String> orderedPostProcessorNames = new ArrayList<String>();
List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
for (String ppName : postProcessorNames) {
if (isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
//保存所有的BeanPostProcessor
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
OrderComparator.sort(priorityOrderedPostProcessors);
//注册所有的BeanPostProcessor
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
OrderComparator.sort(orderedPostProcessors);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
OrderComparator.sort(internalPostProcessors);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
}
//在容器中添加BeanPostProcessor private void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) { for (BeanPostProcessor postProcessor : postProcessors) { beanFactory.addBeanPostProcessor(postProcessor); } }
2、执行所有的BeanPostProcessor
在Spring容器在初始化Bean前后都会执行所有的BeanPostProcessor的实现类提供的方法。public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; //getBeanPostProcessors()获取所有的BeanPostProcessor的实现类 for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { //执行BeanPostProcessor实现类的方法 result = beanProcessor.postProcessAfterInitialization(result, beanName); if (result == null) { return result; } } return result; }
相关文章推荐
- [spring源码学习]五-BeanPostProcessor的使用
- [spring源码学习]五-BeanPostProcessor的使用
- Spring源码学习--BeanFactoryPostProcessor
- Spring 源码梳理(三) 再谈BeanPostProcessor
- 浅析Spring IoC源码(四)分析BeanPostProcessor(1)
- 【Spring学习23】容器扩展点:后置处理器BeanPostProcessor
- spring 源码分析之BeanPostProcessor
- Spring源码分析之BeanPostProcessor接口和BeanFactoryPostProcessor接口方法不执行原因分析
- Spring源码解析-AutowiredAnnotationBeanPostProcessor
- Spring源码分析之BeanPostProcessor接口和BeanFactoryPostProcessor接口方法不执行原因分析
- 做一个合格的程序猿之浅析Spring IoC源码(四)分析BeanPostProcessor(1)
- spring学习(六)spring中的BeanPostProcessor
- Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Spring源码解析笔记9——容器的功能扩展BeanFactory的后处理(BeanFactoryPostProcessor)
- 做一个合格的程序猿之浅析Spring IoC源码(六)BeanFactoryPostProcessor
- spring源码学习笔记-初始化(三) registerBeanPostProcessors
- Spring学习08--IoC容器的高级特性(lazy-init、FactoryBean、BeanPostProcessor、autowiring)
- Spring 源码梳理(四) BeanFactoryPostProcessor
- 【spring源码分析】BeanDefinitionRegistryPostProcessor接口可自定义bean加入IOC
- Ioc容器BeanPostProcessor-Spring 源码(3)