Spring启动过程中实例化前部分的分析

打印 上一主题 下一主题

主题 929|帖子 929|积分 2787

 
代码部分
  说明
    1.hasInstantiationAwareBeanPostProcessors()方法说明
        其实是判断  AbstractBeanFactory类的hasInstantiationAwareBeanPostProcessors中  是否标志有处理器( 5.3版本后其实是存放于BeanPostProcessorCache中,里面有四个List都是用于存放各种处理器的缓存,不用多做在意,因为5.3之后都是一次性全部遍历存完,优化了部分)
     2.applyBeanPostProcessorsBeforeInstantiation(Class beanClass, String beanName) 方法说明
           该方法作用有两种,一种是修改对象实例元数据(因为还没被创建,所以元数据的改动会导致实例的改动),一种是提前返回Bean对象(可以返回自己定义的某个对象实例)
     3.applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) 方法说明
           该方法为初始化后的调用方法,为什么如果bean创建后要调用呢?  因为这个方法与AOP有关,在这个方法中进行AOP,是每个bean都要进行处理的方法,在这个方法内判断需不需要进行动态代理,不需要就返回本身,需要就进行动态代理。(具体可查看  Spring的AOP底层解析  )
  代码展示
  1. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  2.     Object bean = null;
  3.     if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  4.         if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  5.             Class<?> targetType = determineTargetType(beanName, mbd);
  6.             if (targetType != null) {
  7.                 bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
  8.                 if (bean != null) {
  9.                     bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
  10.                 }
  11.             }
  12.         }
  13.         mbd.beforeInstantiationResolved = (bean != null);
  14.     }
  15.     return bean;
  16. }
复制代码
   
  版本区别的记录展示
    applyBeanPostProcessorsBeforeInstantiation方法的差异(applyBeanPostProcessorsAfterInitialization方法类似,就写出来了)
      说明
        1.改进后的版本明显会比之前版本要快,而且会简化一点,因为BeanPostProcessor的全部遍历只会进行一次,而不是每个Bean都会全部遍历一次。(这里面涉及到策略设计模式,本质上取决于,如果bean被创建出来了,后面的处理器其实就不会被调用)
        2.以空间换时间的思维更加明显,相比于名称都要拿出全部的BeanPostProcessor进行遍历(而且某些类型还不是需要的),不如按照类型进行划分缓存,虽说消耗了一定量的空间,但是能更快速的按照类型拿出需要的BeanPostProcessor进行遍历处理
      代码展示
  1. //5.3之前的版本
  2. protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  3.     for (BeanPostProcessor bp : getBeanPostProcessors()) {
  4.         if (bp instanceof InstantiationAwareBeanPostProcessor) {
  5.             InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  6.             Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
  7.             if (result != null) {
  8.                 return result;
  9.             }
  10.         }
  11.     }
  12.     return null;
  13. }
  14. //5.3之后的版本
  15. static class BeanPostProcessorCache {
  16.     final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>();
  17.     final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>();
  18.     final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>();
  19.     final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>();
  20. }
  21. BeanPostProcessorCache getBeanPostProcessorCache() {
  22.     BeanPostProcessorCache bpCache = this.beanPostProcessorCache;
  23.     if (bpCache == null) {
  24.         bpCache = new BeanPostProcessorCache();
  25.         for (BeanPostProcessor bp : this.beanPostProcessors) {
  26.             if (bp instanceof InstantiationAwareBeanPostProcessor) {
  27.                 bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp);
  28.                 if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
  29.                     bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp);
  30.                 }
  31.             }
  32.             if (bp instanceof DestructionAwareBeanPostProcessor) {
  33.                 bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp);
  34.             }
  35.             if (bp instanceof MergedBeanDefinitionPostProcessor) {
  36.                 bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp);
  37.             }
  38.         }
  39.         this.beanPostProcessorCache = bpCache;
  40.     }
  41.     return bpCache;
  42. }
  43. protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  44.     for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
  45.         Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
  46.         if (result != null) {
  47.             return result;
  48.         }
  49.     }
  50.     return null;
  51. }
复制代码
 
  1. applyBeanPostProcessorsAfterInitialization
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表