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
- Spring源码学习--BeanPostProcessor
- [spring源码学习]五-BeanPostProcessor的使用
- Spring 源码梳理(二) BeanPostProcessor
- spring源码解读:BeanPostProcessor接口
- Spring源码之ApplicationContext(六)注册BeanPostProcessor
- Spring 源码梳理(三) 再谈BeanPostProcessor
- spring学习(六)spring中的BeanPostProcessor
- Spring-BeanPostProcessor
- spring BeanPostProcessor
- 浅析Spring IoC源码(四)分析BeanPostProcessor(1)
- 浅析Spring IoC源码(五)再谈BeanPostProcessor(2)
- Ioc容器BeanPostProcessor-Spring 源码(3)
- spring学习5- Container Extension Points(BeanPostProcessor 与BeanFactoryPostProcessor)
- 【Spring学习23】容器扩展点:后置处理器BeanPostProcessor
- Spring 的 BeanPostProcessor
- Spring中的BeanPostProcessor接口
- Spring之BeanPostProcessor接口
- spring-扩展点-BeanPostProcessor
- 05--MySQL自学教程:DDL(Data Definition Language:数据库定义语言)操作数据库中的表(二)
- SAP HANA XS Administration Tool
- uboot源码——mmc驱动分析
- 强制关闭tomcat.运维小工具
- bootstrap下拉菜单
- Spring源码学习--BeanPostProcessor
- 网络操作系统
- Picasso源码完全解析(四)--Action分发和执行
- Adaboost算法与应用实例简析
- javaSE_8系列博客——Java语言的特性(四)--注解--(1)--基础知识
- POJ 1181 Bus Terminals 笔记
- 二叉树的非递归前序,中序,后续遍历实现
- 【C#】之泛型基础概念
- LeetCode 447. Number of Boomerangs ***** 灵活键,查找表