Spring源码学习--BeanPostProcessor

来源:互联网 发布:离线的翻译软件 编辑:程序博客网 时间:2024/06/05 10:43

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);//保存所有的BeanPostProcessorpriorityOrderedPostProcessors.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);//注册所有的BeanPostProcessorregisterBeanPostProcessors(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());}
//在容器中添加BeanPostProcessorprivate 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;}






阅读全文
1 0
原创粉丝点击