您的位置:首页 > 编程语言 > Java开发

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"/>

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: