## 十八、Spring的后置处理器BeanPostProcessor

我们先来看一下BeanPostProcessor的家族体系,这五个接口是实现Spring容器扩展的关键接口,所有的后置处理器必须实现这里面的其中之一或者好几个接口,才能在spring容器创建每个bean时的整个流程中的不同阶段对bean做出定制化的修改。这就是BeanPostProcessor的核心,同时也指出,这个是采用了观察者模式,AbstractAppliacationContext持有BeanFactory,在BeanFactory创建后,先往BeanFactory中添加一系列的后置处理器,那么在调用BeanFactory的getBean方法去获取bean的时候,在不同阶段回调之前在BeanFactory中添加的一系列的后置处理器的不同方法,从而干涉到Bean的整个创建过程,通过细化BeanPostProcessor接口成好多的子接口,就是为了达到一种精细化控制bean创建过程的目的。

那么其实在这里已经很明显了,问题只剩两个。其一,Bean的创建过程分为哪几个阶段。其二,后置处理器又是分别在哪些阶段切入进去的。如果这两个问题搞清楚了,那么后置处理器也就弄明白了。

为了彻底的了解后置处理器,有必要先重温一下spring容器初始化、创建、刷新流程。

首先:所有的加载顺序都是封装在AbstractApplicationContext的refresh()方法中,所以所有的顺序问题,一旦迷路了,都可以先回归到这个方法。

以XmlWebApplicationContext为例,AbstractApplicationContext持有BeanFactory,首先由AbstractApplicationContext的子类AbstractRefreshableApplicationContext在refreshBeanFactory()方法中直接new创建了DefaultListableBeanFactory对象这样的BeanFactory,这样BeanFactory就创建好了。然后AbstractApplicationContext的子类AbstractXmlApplicationContext接着在loadBeanDefinitions(beanFactory)方法中,直接new了一个XmlBeanDefinitionReader,并且把刚刚创建的beanFactory给传进去了,并且把AbstractXmlApplicationContext的一些环境对象也都设置给了这个Reader对象,特别注意的是AbstractXmlApplicationContext同时持有我们写的Spring的配置文件。好的,到这里Reader已经可以拿到beanFactory,然后其实就是相当于AbstractXmlApplicationContext委托这个Reader对象,去读取我们配置的Spring配置文件,把配置文件中的我们定义的bean信息读取成BeanDefinition,并且存到BeanFactory中。这样我们的BeanFactory就已经获取到了BeanDefinition。

至此,我们已经可以明白ApplicationContext,BeanFactory,Reader,Spring的配置文件之间的关系了,以及它们之间是怎么玩的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值