吾本轻狂|Spring4基础知识九:Spring之IoC-Bean装配之Bean后处理器
上一章节《Spring4基础知识八:Spring之IoC-Bean装配之定制Bean生命始末》
如果文中有纰漏,请多多指正!!!
IoC部分将会讲解有关Bean装配的相关知识 , 比较零散 , 主要分三大块:
- Bean装配:对象的创建 , 不涉及过程也就是属性初始化 。
- 基于XML的DI:主要讲解Bean的初始化配置 , 也就是属性的初始化配置 。
- 基于注解的DI:将XML配置转为注解配置 。
Bean后处理器
- Bean后处理器(Bean后置处理器)允许在调用初始化方法前后对 Bean 进行额外的处理 , 也就是功能的扩展或增强 。
- Bean后处理器是一种特殊的Bean , 容器中的所有Bean在初始化时 , 都会自动调用该Bean的两个方法 。 因为是自动调用 , 所以在配置时 , 不需要配置该Bean的id属性 。
- 那么在代码上该怎么实现一个Bean后处理器呢?那就要实现接口BeanPostProcessor 。 该接口包含两个方法 , 分别会在目标Bean初始化完毕之前和之后执行 , 执行后返回值就是功能被扩展或者增强后的Bean对象 。
- 那么什么又是初始化完毕呢?有没有什么标志?答案是有的 。 一个Bean初始化完毕的标志是:一个方法即将被执行 。 也就是说当该方法被执行时 , 也就说明Bean已经被初始化完毕 。 所以Bean后处理器的两个方法会在这个方法被调用前后执行 。
- 首先介绍一下Bean后处理器的接口:BeanPostProcessor 。
public interface BeanPostProcessor {//该方法会在Bean初始化完毕之前执行Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;//该方法会在Bean初始化完毕之后执行Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;}参数介绍:Object bean:即将初始化的目标Bean的实例 。
String beanName:为目标Bean的id属性(如果没有id属性 , 则为那么属性值)
- 另外 , 如果我们配置了多个Bean后处理器的执行顺序该怎么控制呢?
Ordered接口:
public interface Ordered {/*** 高优先级* Useful constant for the highest precedence value.*/int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;/*** 低优先级* Useful constant for the lowest precedence value.*/int LOWEST_PRECEDENCE = Integer.MAX_VALUE;int getOrder();}PriorityOrdered:接口public interface PriorityOrdered extends Ordered {}如果在开发中这两个接口都被实现那么执行顺序又是什么样的呢?程序会先调用实现PriorityOrdered接口 , 再调用实现Ordered接口 , 最后是没有实现接口的 。 源码(用if ... else if ...else 判断的)public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {//省略// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.List priorityOrderedPostProcessors = new ArrayList();List internalPostProcessors = new ArrayList();List orderedPostProcessorNames = new ArrayList();List nonOrderedPostProcessorNames = new ArrayList();for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}//省略}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- LOL|宁王人物志,谁能想到年少轻狂的他最后能成就传奇?他的故事还在继续
- 吾本轻狂|新思科技助力法国电信企业SFR应对软件安全挑战
- 吾本轻狂|设计行业如何在新基建时代抢占先机?
- 吾本轻狂|网易云音乐灰色歌曲下载方法,下架歌曲轻松听
- 笑看尘世|Spring4基础二二-AOP篇-通知(2)-通知详解
- 吾本轻狂|手机充电这点小事?不,那是大事
- 吾本轻狂|2799元的吃鸡配置香不香
- 难免轻狂|老照片上色后真美
- 吾本轻狂|微软最强版DX12杀到:AMD开始爆发比拼NV
- 吾本轻狂|Win10怎么看电脑显卡内存
