老生谈spring(十七):BeanDefinition的合并原理

本文深入探讨Spring框架中BeanDefinition的合并原理,这是在创建非懒加载单例bean过程中不可或缺的步骤。文章通过实例展示了BeanDefinition如何支持继承,并详细解释了在合并过程中,子BeanDefinition如何覆盖父BeanDefinition的属性。了解这一机制对于理解Spring的IOC容器至关重要。
摘要由CSDN通过智能技术生成

老生谈spring(十七):preInstantiateSingletons

序言:前面用了比较多的章节讲解了spring从创建容器、扫描得到BeanDefinitionMap、BeanFactoryPostProcessor的初始化及其方法的执行以及BeanPostProcessor的初始化和注册等等,接下来将进入spring framework的重中之重:IOC和AOP的源码讲解。本节开始将正式开始讲解spring bean创建的一系列生命周期,内容精彩不要错过哦。

1、在finishBeanFactoryInialization方法中,调用了beanFactory的preInstantiateSingletons方法。从注释上就指定这个方法是用来创建非懒加载的单例bean。在这里插入图片描述2、spring遍历beanDefinitionNames拿到beanName,首先做的是合并BeanDefinition。为什么要合并呢?这是因为spring的BeanDefinition支持继承,BeanDefinition的继承能够简化代码和配置。
在这里插入图片描述
3、下面举个BeanDefinition合并的例子,以便更好地理解这个合并原理。首先定义一个父类parent和子类son,他们都有属性name。
在这里插入图片描述在这里插入图片描述4、然后在xml上对这两个bean进行定义,parent为抽象类,son的parent属性执行parent,parent的bean定义中给name赋值。
在这里插入图片描述5、打印son的name属性,可以看到son的name属性也被赋值成了people。
在这里插入图片描述
在这里插入图片描述6、合并前先从mergedBeanDefinitions容器中取,如果有就直接返回,如果没有才进行合并
在这里插入图片描述7、这里的代码也不难也很容易阅读,主要做的也就是,获取到当前BeanDefintion的parent,然后将当前bd的内容覆盖parent的内容,然后放入一个rootBeanDefintion进行返,所以基于这个特性我们可以总结到,这里子BeanDefinition是可以覆盖父Beanfinition的属性,也就是说,如果子Beanfinition和父Beanfinition都有A属性,那么后面的生命周期中会以子Beanfinition的A属性为准。

	protected RootBeanDefinition getMergedBeanDefinition(
			String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
			throws BeanDefinitionStoreException {
   

		synchronized (this.mergedBeanDefinitions) {
   
			RootBeanDefinition mbd = null;

			// Check with full lock now in order to enforce the same merged instance.
			if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值