spring源码 - bean的实例化过程

在整个bean实例化过程中以下类启非常重要的作用,主要用于收集beanfactory中是存在相对接口实现类

static class BeanPostProcessorCache {
   final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>();
   final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>();
   final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>();
   final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>();
}

这个类有非常重要的作用,在bean的实例化各个阶段都会确认spring中是否包含了相关类,穿插在各个阶段使用,主要是通过以下方法来初始化此类:

BeanPostProcessorCache getBeanPostProcessorCache() {
   BeanPostProcessorCache bpCache = this.beanPostProcessorCache;
   if (bpCache == null) {
      bpCache = new BeanPostProcessorCache();
      for (BeanPostProcessor bp : this.beanPostProcessors) {
         if (bp instanceof InstantiationAwareBeanPostProcessor) {
            bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp);
            if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
               bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp);
            }
         }
         if (bp instanceof DestructionAwareBeanPostProcessor) {
            bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp);
         }
         if (bp instanceof MergedBeanDefinitionPostProcessor) {
            bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp);
         }
      }
      this.beanPostProcessorCache = bpCache;
   }
   return bpCache;
}

初始化前执行逻辑:

1. 先执行instantiationAware中对象的postProcessBeforeInstantiation方法

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

2.如查1中返回的不为null,执行beanPostProcessors对象中的postProcessAfterInitialization方法

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;
}

经过1和2如果bean通过InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法正常生成后继就可以不用执行。
扩展点:
如果你不想让框架自已生成的BEAN,可以自定义实现InstantiationAwareBeanPostProcessor接口类来现

3.将beforeInstantiationResolved赋值为true,如果2中返回的bean不为null,否则设为false

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;
}

经过以上步骤如果bean不为空说明bean生成结束,不进行以下步骤

4.如果经过前面的1、2、3过程之后bean为空,找出前面的

SmartInstantiationAwareBeanPostProcessor对象执行determineCandidateConstructors得到beanclass的构造函数
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
      throws BeansException {

   if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
      for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
         Constructor<?>[] ctors = bp.determineCandidateConstructors(beanClass, beanName);
         if (ctors != null) {
            return ctors;
         }
      }
   }
   return null;
}

扩展点:
这里可以干涉bean实际生成的构造函数

5.通过调用构造函数生成BeanWrapperImpl对象

if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
      mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
   return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
   return autowireConstructor(beanName, mbd, ctors, null);
} 
return instantiateBean(beanName, mbd);

生成BeanWrapper对象并注册CustomEdit,spring主要提供基础类型的
到这里bean对象已生成

6.bean生成后执行MergedBeanDefinitionPostProcessor对象的postProcessMergedBeanDefinition方法

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
   for (MergedBeanDefinitionPostProcessor processor : getBeanPostProcessorCache().mergedDefinition) {
      processor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
   }
}

在里只能对beandefintion.beanType、beanName最后的处理

在spring内部的ApplicationListenerDetector类的逻辑,主要看bean是否实现了ApplicationListener接口

public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
   if (ApplicationListener.class.isAssignableFrom(beanType)) {
      this.singletonNames.put(beanName, beanDefinition.isSingleton());
   }
}

7.将生成的bean经过beanfactory中SmartInstantiationAwareBeanPostProcessor接口对象方法getEarlyBeanReference处理放入singletonFactories属性中

以下过程是进行实例化对象的属性性填充

8.执行populateBean方法

  1. 执行beanfactory中拥有InstantiationAwareBeanPostProcessor对象postProcessAfterInstantiation方法,如果不是返回true退出
    扩展点: 这里干涉给bean属性填值
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
   for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
      if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
         return;
      }
   }
}
  1. 执行autowired有关内容
  2. 查看beanfactory中是否有InstantiationAwareBeanPostProcessor类对象,如有执行postProcessProperties方法,返回PropertyValues对象,如果为空在执行其postProcessPropertyValues方法
        for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {  
   PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
   if (pvsToUse == null) {
      if (filteredPds == null) {
         filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
      }
      pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
      if (pvsToUse == null) {
         return;
      }
   }
   pvs = pvsToUse;
}

扩展点:
这里可以干涉PropertyValue的值,通过实现InstantiationAwareBeanPostProcessor 接口的postProcessPropertyValues方法

4)进行bean属性赋值
if (pvs != null) {
applyPropertyValues(beanName, mbd, bw, pvs);
}

9.执行initializeBean(beanName, exposedObject, mbd)方法

1) 执行invokeAwareMethods方法,确认bean是否为BeanNameAware、BeanClassLoaderAware、BeanFactoryAware三个接口实现类,若是执行对应方法

private void invokeAwareMethods(String beanName, Object bean) {
   if (bean instanceof Aware) {
      if (bean instanceof BeanNameAware) {
         ((BeanNameAware) bean).setBeanName(beanName);
      }
      if (bean instanceof BeanClassLoaderAware) {
         ClassLoader bcl = getBeanClassLoader();
         if (bcl != null) {
            ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
         }
      }
      if (bean instanceof BeanFactoryAware) {
         ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
      }
   }
}

扩展点:
这里可以修改自已的bean名字,如果bean是BeanNameAware的接口实现

2)执行applyBeanPostProcessorsBeforeInitialization方法,主要是确认是否beanfactory中实现了BeanPostProcessor接口对象,然后调用其postProcessBeforeInitialization方法
从下面的代码逻辑可以出调用postProcessBeforeInitialization后,返回值不为null,bean变为其返回的值

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

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

这里在启动阶段会调用spring中默认的ApplicationListenerDetector类的postProcessBeforeInitialization方法,主要对于bean是实现ApplicationListener接口类的加入到侦听框架事件中。
扩展点:
beanfactory中如果有自定义实现BeanPostProcessor接口类,可以通过postProcessBeforeInitialization方法修改bean有关信息

10.调用bean的init-method方法

11.执行beanfactory中实现BeanPostProcessor接口对象的postProcessAfterInitialization方法

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;
}

扩展点:
这里干涉bean的有关内容

12.确认bean的销毁有关

1)bean是否是DisposableBean、AutoCloseable接口实现类
2)确认bean是否有销毁方法
3)确认beanfactory中是否有DestructionAwareBeanPostProcessor接口实现类对象,如果并执行其方法requiresDestruction,并返回bool值
若1、2、3条件都为true,执行以下逻辑注册bean的disposableBeans信息
registerDisposableBean(beanName, new DisposableBeanAdapter( bean, beanName, mbd, getBeanPostProcessorCache().destructionAware, acc));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值