Spring Bean的生命周期

1.BeanDefinition对象的创建

加载一个Bean,首先要将Bean对应的class文件加载进来,同时生成一个BeanDefinition对象,将class文件中的类信息分块归类的存放到这个BeanDefinition对象中
BeanDefinition对象的作用:

  • 用来确定Bean的类型
  • 存储加载类的信息
  • 包括加载验证等阶段
    在完成BeanDefinition对象的创建之后,将这个对象放入一个map中

2.Bean实例化

根据BeanDefinition中定义的类信息,执行doCreateBean方法,创建类实例,此时创建的类对象是目标类的一个空对象,既不是对象实例因为还没有进行初始化,更不是Bean。对于Spring容器来说,Spring容器管理的是Bean对象,而不是仅仅将类加载并进行初始化那么简单。

3.提前暴露

此时会将这个半成品Bean,封装成一个工厂对象,同时将这个Bean的后置处理器挨个执行,最后将这个工厂对象存入Spring的第三级缓存中。这么做是为了解决循环依赖的问题。


protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
                SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
                exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
            }
        }
    }
    return exposedObject;
}

图解循环依赖:
在这里插入图片描述

4.属性填充

执行populateBean方法,为Bean进行属性填充
@Autowired和@Resource区别

  • autowired默认使用类型去注入,而resource默认使用对象名去注入
  • @Autowired的在依赖注入时,使用的后置处理器是AutowiredAnnotationBeanPostProcessor
  • @Resource使用的后置处理器是CommonAnnotationBeanPostProcessor
// AbstractAutowireCapableBeanFactory#populateBean
	// beanName : bean 的name
	// mbd  :  bean的定义信息
	// bw  : bean实例的包装类型,里面有bean的实例
	protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		if (bw == null) {
			 没有属性抛出异常
			if (mbd.hasPropertyValues()) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				return;
			}
		}
		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
		// state of the bean before properties are set. This can be used, for example,
		// to support styles of field injection.
		//
		boolean continueWithPropertyPopulation = true;
         //mbd.isSynthetic() 合成类
		//todo 第五次---判断属性是否填充:InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
		// 给InstantiationAwareBeanPostProcessor最后一次机会在属性设置前来改变bean
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}
 
		if (!continueWithPropertyPopulation) {
			return;
		}
		//获取容器在解析Bean定义资源时为BeanDefiniton中设置的属性值
		//这个是程序员在 bd中 写入的属性rootBeanDefinition.getPropertyValues().add("type","男的");
		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
 
		 2. 自动装配 :autowiring自动装配的。根据名称或类型自动注入
		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
 
 
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
 
			// Add property values based on autowire by name if applicable.
			//根据Bean名称进行autowiring自动装配处理
			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
				autowireByName(beanName, mbd, bw, newPvs);
			}
 
			// Add property values based on autowire by type if applicable.
			//根据Bean类型进行autowiring自动装配处理
			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
				autowireByType(beanName, mbd, bw, newPvs);
			}
 
			pvs = newPvs;
		}
		//对非autowiring的属性进行依赖注入处理
		// 后处理器已经初始化
		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
		boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
 
		if (hasInstAwareBpps || needsDepCheck) {
			if (pvs == null) {
				pvs = mbd.getPropertyValues();
			}
			PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			if (hasInstAwareBpps) {
				//TODO 获取的bean所有后置处理器找到 所有需要注入的属性
				// 这里会进行 @Autowired 和 @Resource 的注入工作
				// 属性填充InstantiationAwareBeanPostProcessor
				for (BeanPostProcessor bp : getBeanPostProcessors()) {
					if (bp instanceof InstantiationAwareBeanPostProcessor) {
						InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
						//下面是完成属性注入的
						pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						// 如果postProcessProperties 返回null,再调用 postProcessPropertyValues这个过时的方法
						if (pvs == null) {
							return;
						}
					}
				}
			}
			if (needsDepCheck) {
				// 依赖检查,对应 depends-on 属性,3.0 已弃用
				checkDependencies(beanName, mbd, filteredPds, pvs);
			}
		}
		if (pvs != null) {
			 4. 将属性应用到bean中
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
}

5.BeanPostProcessor的beforeInit

如果定义了后置处理器的beforeInit方法,则在这个步骤会执行

6.初始化

如果有给Bean的属性设置默认值,则在这个步骤进行赋值。

7.BeanPostProcessor的afterInit方法

同样的,如果定义了后置处理器的afterInit方法,则在这个步骤会执行

生成Bean对象,放入容器中

最终,将这个Bean放入SingleTon单例池中,也就是我们常说的容器。
简化的生命周期流程图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值