吾本轻狂|Spring4基础知识九:Spring之IoC-Bean装配之Bean后处理器

上一章节《Spring4基础知识八:Spring之IoC-Bean装配之定制Bean生命始末》
如果文中有纰漏,请多多指正!!!
IoC部分将会讲解有关Bean装配的相关知识 , 比较零散 , 主要分三大块:

  • Bean装配:对象的创建 , 不涉及过程也就是属性初始化 。
  • 基于XML的DI:主要讲解Bean的初始化配置 , 也就是属性的初始化配置 。
  • 基于注解的DI:将XML配置转为注解配置 。
在IoC部分结束后 , 会做相关总结 , 大家在学习的过程中 , 也可以试着做些总结 。
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后处理器的执行顺序该怎么控制呢?
如果我们配置了多个 Bean后处理器 , 可以通过设置 BeanPostProcessor 实现PriorityOrdered接口或者 Ordered 接口提供的 order 属性来控制这些 BeanPostProcessor 接口的执行顺序 。
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);}}//省略}


推荐阅读