spring之Bean的生命周期之BeanDefinition的合并解析

本文探讨了Spring中Bean的生命周期,重点解析了BeanDefinition的合并过程。在Spring初始化单例Bean时,会通过getMergedLocalBeanDefinition方法合并BeanDefinition,这个过程允许子BeanDefinition覆盖父BeanDefinition的属性。在没有parent的情况下,会创建新的RootBeanDefinition。如果存在parent,会递归合并直至找到最顶层的BeanDefinition,确保灵活性和代码复用。
摘要由CSDN通过智能技术生成

概述

开发人员写的类被spring扫描到容器后,并不是一开始就是一个完整的Bean了,spring扫描的是被注解或者是xml配置的类的信息,spring将类的信息或者是xml的信息保存在BeanDefinition的数据结构中,然而,如果我们想要得到一个可以使用的对象,是需要由spring来创建,这也就是网上常说的将bean的管理和创建交给spring

由于bean的生命十分复杂,涉及的点也比较多,本文主要对BeanDefintion的合并进行解析,而关于生命周期的后面的内容会陆续跟新

生命周期

首先简单看一下生命周期前的方法调用栈

在这里插入图片描述从方法名字就可以看出核心的方法preInstantiateSingletons,在这里面就会完成spring 的单例Bean的初始化
接下来直接进入preInstantiateSingletons

在preInstantiateSingletons这个方法里面有两个for循环,我们来看第一个

List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
		for (String beanName : beanNames) {
    
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
   
				if (isFactoryBean(beanName)) {
   
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
   
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
   
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
   
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
   
							getBean(beanName);
						}
					}
				}
				
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值