Spring源码解读——后置处理器(增强器)、BeanFacotory

我们先看一个案例:

 例如我们在XML文件中定义了这样一个Bean对象,根据我们上述的描述,它会在BeanDefinitionReader中进行解析,获取到id、class等等属性,然后生成BeanDeifinition定义信息对象,但是在property中username、password、url、driverClassName这四个值,我们一般都是指定一个额外的配置文件例如db.properties,然后我们在解析的时候,可以完成属性值的替换,那么我们在创建完BeanDefinition对象之后,这个属性值的替换在哪里完成呢?

答案就是PostProcessor后置处理器(增强器),它的作用就是提供某些额外的扩展功能;

常用的有两个接口,第一个是BeanFactoryPostProcessor,第二个是BeanPostProcessor;这两个接口都是可以提供某些额外的扩展功能的,但是它们两个针对的操作对象是不同的;第一个针对的操作对象是BeanFactory,第二个针对的操作对象是Bean对象

什么是BeanFactory?

大家可能之前看过一些帖子或者文章,说BeanFactory是一个Bean工厂,但其实这样说并不是很准确,我们打开源码来看看它的注释:

 注释里第一行就很清晰的提到了:这是一个用来访问Spring Bean容器的根接口;如下图:

BeanFactory有什么用?

 我们再来思考我们在日常使用中如果想要获取Bean对象,调用的是ApplicationContext对象的getBean方法,那么我们来看看它的一个继承关系:

 

我们再来看这个getBean方法其实是在BeanFactory中的,而ApplicationContext接口只是提供了一些更加详细的、更加完善的基础功能来满足用户的需要;

既然BeanFactory是用来访问Spring Bean容器的根接口,那么我们如果想要修改这个容器里面的一些东西的时候,就可以通过BeanFactory来操作;而我们想要操作BeanFactory,就可以使用到我们刚才提到的后置处理器的扩展接口:BeanFactoryPostProcessor

 

 这个接口里面有且只有一个方法,我们先不看这个方法,我们直接看他的一个实现类:

PlaceholderConfigurerSupport

 我们来看这个实现类的注释:

“这是一个用来处理在BeanDefinition对象中的property的value值中的占位符的资源配置的抽象基础类”,

也就是在这个基础类中完成了value值占位符的替换

执行过程

我们就以刚才在XML中写的Bean对象,加上一些基础的代码来观看一下它的源码执行过程:

 1.首先在跟我们所说的一样,它创建了BeanDefinition对象,这个对象是一个Map接口,存储的Bean的定义信息;

2.我们现在点开我们的datasource对象,再点开value,在value里面有我们的propertyValues,点开propertyValueList,可以看到当前这个username的属性值依旧是我们占位符的表达式,还没有完成值的替换

 3.我们往下走点开下面这个方法,这个方法很明显就是调用BeanFactory的后置处理器:

4.我们来看看这个方法执行完之后的效果:

这个时候我们发现它已经完成了属性值的替换,跟我们刚才描述的一样;

 结论

因此我们可以发现在BeanDefinition对象创建完成之后,它会自己再去调用BeanFactory的后置处理器完成属性值的替换,但是一般我们在开发的时候针对BeanFactory操作的后置处理器用的是比较少的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值