Spring Bean生命周期详解-从Bean转化为BeanDefinition到Bean的销毁全过程

Spring Bean 生命周期

目前只写了各个阶段的轮廓,后续会继续补充

1. BeanDefinition的发现与注册

分为三个步骤: BeanDefinition的发现,抽象与注册。
Bean通过相应的Reader转变为Spring 内部数据的抽象BeanDefinition,调用 BeanDefinitionRegistry #registerBeanDefinition(String beanName, BeanDefinition beanDefinition)进行注册,一般是DefaultListableBeanFactory 作为 BeanDefinitionRegistry

  • XML

    通过XmlBeanDefinitionReader 进行读取(例如classpath下面的bean.xml)

   DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
   XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
   reader.loadBeanDefinitions("classpath:\\MATE-INFO\\bean.xml");
  • 注解

    通过 AnnotatedBeanDefinitionReader进行读取

2. BeanDefinition 的合并

getMergedLocalBeanDefinition, 如果有父类BeanDefinition 会将父类的属性先复制过来,然后子类有的属性覆盖父类

3. 实例化前阶段

如果有定义的实例化前置方法 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation返回不为空则不走spring自己的实例化方法直接将生成的Bean返回 ,applyBeanPostProcessorsAfterInitialization方法在返回Bean之前调用初始化后置方法 BeanPostProcessor#postProcessAfterInitialization

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
   
		Object bean = null;
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
   
			// Make sure bean class is actually resolved at this point.
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
   
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
   
					bean = applyBeanPostProcessorsBeforeInstantiation(
                        targetType, beanName);
					if (bean != null) {
   
						bean = applyBeanPostProcessorsAfterInitialization(
                            bean, beanName);
					}
				}
			}
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}


protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass,
                                                            String beanName) {
   
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
   
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
   
				InstantiationAwareBeanPostProcessor ibp =(InstantiationAwareBeanPostProcessor) bp;
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
   
					return result;
				}
			}
		}
		return null;
	}

	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {
   

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
   
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
   
				return result;
			}
			result = current;
		}
		return result;
	}




4. 实例化阶段

创建一个Bean的实例

public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
   
   // Don't override the class with CGLIB if no overrides.
   if (!bd.hasMethodOverrides()) {
   
      Constructor<?> constructorToUse;
      synchronized (bd.constructorArgumentLock) {
   
         constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
         if (constructorToUse == null) {
   
            final Class<?> clazz = bd.getBeanClass();
            if (clazz.isInterface()) {
   
               throw new BeanInstantiationException(clazz, "Specified class is an interface");
            }
            try {
   
               if (System.getSecurityManager() != null) {
   
                  constructorToUse = AccessController.doPrivileged(
                        (PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
               }
               else {
   
                  constructorToUse = clazz.getDeclaredConstructor();
               }
               bd.resolvedConstructorOrFactoryMethod = constructorToUse;
            }
            catch (Throwable ex) {
   
               throw new BeanInstantiationException(clazz, "No default constructor found", ex);
            }
         }
      }
      return BeanUtils.instantiateClass(constructorToUse);
   }
   else {
   
      // Must generate CGLIB subclass.
      return instantiateWithMethodInjection(bd, beanName, owner);
   }
}
5.修改BeanDefinition

在调用populateBean方法前,允许定义的MergedBeanDefinitionPostProcessor修改BeanDefinition的内容,

例如AutowiredAnnotationBeanPostProcessor#applyMergedBeanDefinitionPostProcessors

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
   
	for (BeanPostProcessor bp : getBeanPostProcessors()) {
   
		if (bp instanceof MergedBeanDefinitionPostProcessor) {
   
			MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
			bdp.postProcessMergedBeanDefinition
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值