spring 简单Bean 实例化过程

2020-04-01  本文已影响0人  zjxchase

说明:本文只介绍简单的bean实例化过程,没有注入,没有代理等等

实例

代码

@Service
public class GoodsService {

    public List<String> list() {
        return Arrays.asList("apple");
    }
}

@Configuration
@ComponentScan("com.yunfan.bean.instantiation.simple")
public class SimpleConfig {

}

public class MainTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SimpleConfig.class);

        GoodsService goodsService = (GoodsService) applicationContext.getBean("goodsService");
        System.out.println(goodsService.list());
    }
}

运行结果

> Task :spring-study:MainTest.main()
[apple]

spring Bean 实例化过程

本文只针对 实例GoodsService 实例化过程进行描述,实例化前简单描述:spring 把 GoodsService 类信息保存到BeanDefinition,实例化时从BeanDefinition中读取类信息进行实例化

1、实例化开始

首先打开spring源码 DefaultListableBeanFactory 类的preInstantiateSingletons 方法 , 全路径:org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

@Override
    public void preInstantiateSingletons() throws BeansException {
        if (logger.isTraceEnabled()) {
            logger.trace("Pre-instantiating singletons in " + this);
        }
        // 获取所有BeanDefinition的集合
        List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

        // Trigger initialization of all non-lazy singleton beans...
        // 触发所有非惰性单例bean的初始化…
        for (String beanName : beanNames) {
            // 获取beanName对应的 MergedBeanDefinition, MergedBeanDefinition合并了 子类和父类的信息
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            // bd对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                // 判断beanName对应的bean是否为FactoryBean
                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);
                        }
                    }
                }
                else {
                    // 如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例
                    getBean(beanName);
                }
            }
        }

        // Trigger post-initialization callback for all applicable beans...
        for (String beanName : beanNames) {
            Object singletonInstance = getSingleton(beanName);
            if (singletonInstance instanceof SmartInitializingSingleton) {
                final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
                if (System.getSecurityManager() != null) {
                    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                        smartSingleton.afterSingletonsInstantiated();
                        return null;
                    }, getAccessControlContext());
                }
                else {
                    smartSingleton.afterSingletonsInstantiated();
                }
            }
        }
    }

首先,拷贝一个容器中所有 BeanDefinition 的名称到beanNames的List集合中, list中的内容如图:

批注 2020-03-29 171730.png

beanNames 进行循环遍历并进行实例化,此时我们只关心 goodsService 实例化过程。

第二,获取 goodsServiceRootBeanDefinition 此时的 RootBeanDefinition 是一个 MergedLocalBeanDefinition 即和并了父类 相关信息的 BeanDefinition ,检测bd对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载,因为 goodsService 不是 FactoryBean 则直接执行 getBean(beanName) 获取bean 实例,详细过程请查看 2、获取beangetBean(beanName) 已经把bean 实例化并缓存到单例池中,本方法的第二个for 循环 并并没有对本次流程产生任何影响

2、获取 bean

方法 getBean(beanName) 调用了 doGetBean 方法

@Override
public Object getBean(String name) throws BeansException {
   return doGetBean(name, null, null, false);
}

方法 doGetBean 的全路径是 org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
      @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
   // 返回bean名称,去掉工厂取消引用前缀,并将别名解析为规范名称。
   final String beanName = transformedBeanName(name);
   Object bean;

   // 首先检查单例缓存中手动注册的单例对象。(此处会涉及到注入的逻辑,本次没有注入不过多关注),因为goodsService还没有被创建所以此处sharedInstance为null
   Object sharedInstance = getSingleton(beanName);
   if (sharedInstance != null && args == null) {
      if (logger.isTraceEnabled()) {
         if (isSingletonCurrentlyInCreation(beanName)) {
            logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                  "' that is not fully initialized yet - a consequence of a circular reference");
         }
         else {
            logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
         }
      }
      bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
   }

   else {
      // 缓存中没有,创建这个bean实例:
      // 如果该bean正在创建则抛出异常
      if (isPrototypeCurrentlyInCreation(beanName)) {
         throw new BeanCurrentlyInCreationException(beanName);
      }

      // 检查这个父工厂中是否存在bean定义。本次执行过程中parentBeanFactory 为 null
      BeanFactory parentBeanFactory = getParentBeanFactory();
      if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
         // Not found -> check parent.
         String nameToLookup = originalBeanName(name);
         if (parentBeanFactory instanceof AbstractBeanFactory) {
            return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                  nameToLookup, requiredType, args, typeCheckOnly);
         }
         else if (args != null) {
            // Delegation to parent with explicit args.
            return (T) parentBeanFactory.getBean(nameToLookup, args);
         }
         else if (requiredType != null) {
            // No args -> delegate to standard getBean method.
            return parentBeanFactory.getBean(nameToLookup, requiredType);
         }
         else {
            return (T) parentBeanFactory.getBean(nameToLookup);
         }
      }

      if (!typeCheckOnly) {
         // 标记bean要创建了: 从 mergedBeanDefinitions 中删除,在 alreadyCreated 中添加
         // 让bean定义重新合并,现在我们实际上是在创建bean…以防在此期间它的一些元数据发生变化。
         // 并把 goodsService 加入到 alreadyCreated 集合中
         markBeanAsCreated(beanName);
      }

      try {
         // 重新合并 goodsService 以防在此期间它的一些元数据发生变化。
         final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
         // 检查 MergedBeanDefinition,其实就是检查 goodsService 是否为抽象类,如果是则抛出异常
         checkMergedBeanDefinition(mbd, beanName, args);

         // 保证当前bean所依赖的bean的初始化。 (goodsService 没有依赖注入,所以 dependsOn 为 null)
         String[] dependsOn = mbd.getDependsOn();
         if (dependsOn != null) {
            for (String dep : dependsOn) {
               if (isDependent(beanName, dep)) {
                  throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
               }
               // 为给定bean注册一个从属bean,在销毁给定bean之前销毁它。dep 和 beanName 分别在两个Map中 建立关联关系,表示他们之间的依赖关系
               registerDependentBean(dep, beanName);
               try {
                  getBean(dep);
               }
               catch (NoSuchBeanDefinitionException ex) {
                  throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
               }
            }
         }

         // 创建bean 实例 检测是否是单例模式
         if (mbd.isSingleton()) {
            // 此处调用 getSingleton 方法 传递了两个参数,一个是 beanName, 另一个是 ObjectFactory 的实现类,ObjectFactory 只有一个抽象方法 getObject() ,所以当执行到 ObjectFactory.getObject() 时,其实执行的是 createBean(beanName, mbd, args);
            sharedInstance = getSingleton(beanName, () -> {
               try {
                  return createBean(beanName, mbd, args);
               }
               catch (BeansException ex) {
                  // Explicitly remove instance from singleton cache: It might have been put there
                  // eagerly by the creation process, to allow for circular reference resolution.
                  // Also remove any beans that received a temporary reference to the bean.
                  destroySingleton(beanName);
                  throw ex;
               }
            });
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
         }

         else if (mbd.isPrototype()) {
            // It's a prototype -> create a new instance.
            Object prototypeInstance = null;
            try {
               beforePrototypeCreation(beanName);
               prototypeInstance = createBean(beanName, mbd, args);
            }
            finally {
               afterPrototypeCreation(beanName);
            }
            bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
         }

         else {
            String scopeName = mbd.getScope();
            final Scope scope = this.scopes.get(scopeName);
            if (scope == null) {
               throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
            }
            try {
               Object scopedInstance = scope.get(beanName, () -> {
                  beforePrototypeCreation(beanName);
                  try {
                     return createBean(beanName, mbd, args);
                  }
                  finally {
                     afterPrototypeCreation(beanName);
                  }
               });
               bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
            }
            catch (IllegalStateException ex) {
               throw new BeanCreationException(beanName,
                     "Scope '" + scopeName + "' is not active for the current thread; consider " +
                     "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
                     ex);
            }
         }
      }
      catch (BeansException ex) {
         cleanupAfterBeanCreationFailure(beanName);
         throw ex;
      }
   }

   // Check if required type matches the type of the actual bean instance.
   if (requiredType != null && !requiredType.isInstance(bean)) {
      try {
         T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
         if (convertedBean == null) {
            throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
         }
         return convertedBean;
      }
      catch (TypeMismatchException ex) {
         if (logger.isTraceEnabled()) {
            logger.trace("Failed to convert bean '" + name + "' to required type '" +
                  ClassUtils.getQualifiedName(requiredType) + "'", ex);
         }
         throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
      }
   }
   return (T) bean;
}

首先,转换 bean 的名称,去掉工厂引用前缀,并将别名解析为规范名称。因为 goodsService 没有使用别名并且是一个普通的类,所以最终转换的结果还是 goodsService

第二,从缓存中获取共享实例,因为 goodsService 是首次创建所以 Object sharedInstance = null 进入到 else 分支

第三,检测如果 goodsService 正在实例化则抛出异常

第四,获取父工厂,这里边抛出一个问题:spring的父、子 工厂? 当前 parentBeanFactory = null , 所以不走 if 分支,走 else 分支

第五,标记 beangoodsService 要被创建, 从 mergedBeanDefinitions 集合中删除(让bean定义重新合并,现在是在创建bean…以防在此期间它的一些元数据发生变化。) ,加入到 alreadyCreated 集合中

protected void markBeanAsCreated(String beanName) {
        if (!this.alreadyCreated.contains(beanName)) {
            synchronized (this.mergedBeanDefinitions) {
                if (!this.alreadyCreated.contains(beanName)) {
                    // 让bean定义重新合并,现在我们实际上是在创建bean…以防在此期间它的一些元数据发生变化。
                    clearMergedBeanDefinition(beanName);
                    this.alreadyCreated.add(beanName);
                }
            }
        }
    }

第六,重新合并 MergedBeanDefinition 并检测是不是抽象类

第七,获取 goodsService 初始化所需要的依赖,此时 String[] dependsOn = null

第八,判断 goodsService 是否为单例 mbd.isSingleton() = true , 所以调用 getSingleton(String beanName, ObjectFactory<?> singletonFactory) 方法, 下面的代码 是 ObjectFactory 接口的实现类,大括号 {...} 中便是 T getObject() 的实现方法,即调用 singletonFactory.getObject() 方法时 便是执行大括号里边的代码 。获取单例的具体流程请查看 **3、获取单例对象 **

() -> {
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                            destroySingleton(beanName);
                            throw ex;
                        }
                    }

此处可以获取单例对象

第八,调用 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); getObjectForBeanInstance 会先调用 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getObjectForBeanInstance 在该方法中 需要注意 registerDependentBean(beanName, currentlyCreatedBean); 这一行,当然,本次流程不会执行这行代码,然后调用 org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance 这个方法,在本次流程中bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); 这行代码并没有对 sharedInstance 做任何修改。返回单例对象

3、获取单例对象

根据 beanName 名称返回注册的单例对象,如果没有则创建并注册一个新的单例对象。方法的全路径名是 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(beanName, "Bean name must not be null");
        synchronized (this.singletonObjects) {
            Object singletonObject = this.singletonObjects.get(beanName);
            if (singletonObject == null) {
                // 判断当前是否正在销毁单例bean集合,如果是则抛出异常
                if (this.singletonsCurrentlyInDestruction) {
                    throw new BeanCreationNotAllowedException(beanName,
                            "Singleton bean creation not allowed while singletons of this factory are in destruction " +
                            "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
                }
                // 检测创建的bean 是否在排除创建的集合中(如果在则抛出异常) 和 将beanName 加入 singletonsCurrentlyInCreation (正在创建的bean的集合)
                beforeSingletonCreation(beanName);
                boolean newSingleton = false;
                // 被抑制的异常列表
                boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = new LinkedHashSet<>();
                }
                try {
                    // singletonFactory 生产bean
                    singletonObject = singletonFactory.getObject();
                    newSingleton = true;
                }
                catch (IllegalStateException ex) {
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        throw ex;
                    }
                }
                catch (BeanCreationException ex) {
                    if (recordSuppressedExceptions) {
                        for (Exception suppressedException : this.suppressedExceptions) {
                            ex.addRelatedCause(suppressedException);
                        }
                    }
                    throw ex;
                }
                finally {
                    if (recordSuppressedExceptions) {
                        this.suppressedExceptions = null;
                    }
                    afterSingletonCreation(beanName);
                }
                if (newSingleton) {
                    // 把实例放入缓存中
                    addSingleton(beanName, singletonObject);
                }
            }
            return singletonObject;
        }
    }

首先,加同步锁,再次从单例缓存池 singletonObjects 中获取单例,如果不为null 则直接返回,此时为 null

第二,判断当前是否正在销毁 单例 ,如果是则抛出异常

第三,检测创建的bean 是否在排除创建的集合中(如果在则抛出异常), 将beanName 加入 singletonsCurrentlyInCreation (正在创建的bean的集合)

第四,执行 singletonObject = singletonFactory.getObject();2、获取bean第八 步 的 lambda 表达式, 即 执行 createBean(beanName, mbd, args) 该方法的具体执行流程请查看 4、创建bean,这个行代码将会获得单例对象 singletonObject = GoodsService@1654 并设置 newSingleton = true;

第五,执行 afterSingletonCreation(beanName) 将 beanName 从 singletonsCurrentlyInCreation 集合中移除

第六,执行 addSingleton(beanName, singletonObject) 该方法的代码如下:

protected void addSingleton(String beanName, Object singletonObject) {
        synchronized (this.singletonObjects) {
            this.singletonObjects.put(beanName, singletonObject);
            this.singletonFactories.remove(beanName);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }

返回单例对象

4、解析bean并首次调用后置处理器

该方法执行单例创建前的一次后置处理器,返回一个对象,如果该对象不为null,则直接返回, 如果为 null 则执行 doCreateBean 方法,完成真正的单例的创建

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
            throws BeanCreationException {

        if (logger.isTraceEnabled()) {
            logger.trace("Creating instance of bean '" + beanName + "'");
        }
        RootBeanDefinition mbdToUse = mbd;
        // 解析beanName对应的Bean的类型
        // resolvedClass = com.yunfan.bean.instantiation.simple.GoodsService
        // mbd.hasBeanClass() = true
        // mbd.getBeanClassName() = com.yunfan.bean.instantiation.simple.GoodsService
        Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            // 如果resolvedClass存在,并且mdb不存在beanClass即类型不是Class,并且mdb的beanClassName不为空(则代表beanClass存的是Class的name),
            // 则使用mdb深拷贝一个新的RootBeanDefinition副本,并且将解析的Class赋值给拷贝的RootBeanDefinition副本beanClass属性,
            // 该拷贝副本取代mdb用于后续的操作
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }
    
        try {
            // 对override属性进行标记及验证
            mbdToUse.prepareMethodOverrides();
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                    beanName, "Validation of method overrides failed", ex);
        }

        try {
            // 实例化前的处理,给beanpostprocessor(InstantiationAwareBeanPostProcessor)一个机会返回代理对象来替代真正的bean实例,达到“短路”效果
            // 第一次调用后置处理器
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            // 如果bean不为空,则会跳过Spring默认的实例化过程,直接使用返回的bean
            // 此时 bean = null
            if (bean != null) {
                return bean;
            }
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                    "BeanPostProcessor before instantiation of bean failed", ex);
        }

        try {
            // 创建Bean实例(真正创建Bean的方法)
            Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            if (logger.isTraceEnabled()) {
                logger.trace("Finished creating instance of bean '" + beanName + "'");
            }
            // 返回创建的Bean实例
            return beanInstance;
        }
        catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
            throw ex;
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
        }
    }

首先,解析beanName(goodsService)对应的Bean的类型,resolvedClass = com.yunfan.bean.instantiation.simple.GoodsService

第二,对override属性进行标记及验证

第三,实例化前调用 beanpostprocessor ( InstantiationAwareBeanPostProcessor) 后置处理器返回代理对象来替代真正的bean实例,第一次实例化前调用 后置处理器,返回结果 Object bean = null 继续向下执行,如果bean 不为 null 则直接返回。

第四,调用 doCreateBean 方法创建单例,该方法是真正的创建单例,然后返回单例。想要了解 doCreateBean 的具体流程请查看 5、真正创建bean单例, 返回单例

5、创建 bean 单例

该方法实际创建指定的bean。在这一点上,预创建处理已经发生了,例如检查{@code postProcessBeforeInstantiation}回调。

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {

        // 新建Bean包装类
        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
            // 如果是FactoryBean,则需要先移除未完成的FactoryBean实例的缓存
            // 因为 goodsService 是一个普通的类,所以此处instanceWrapper = null
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
        }
        if (instanceWrapper == null) {
            // 根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper
            /*
            * 第二次调用后置处理器
            * 创建bean实例,并将实例放在包装类BeanWrapper中返回
            * 1、通过工厂方法创建bean实例
            * 2、通过构造方法自动注入创建bean实例
            * 3、通过无参构造器创建bean实例
            * */
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        // 拿到创建好的Bean实例
        final Object bean = instanceWrapper.getWrappedInstance();
        // 拿到Bean实例的类型
        Class<?> beanType = instanceWrapper.getWrappedClass();
        if (beanType != NullBean.class) {
            mbd.resolvedTargetType = beanType;
        }

        // 允许后处理程序修改合并的bean定义。
        synchronized (mbd.postProcessingLock) {
            if (!mbd.postProcessed) {
                try {
                    // 应用后置处理器MergedBeanDefinitionPostProcessor,允许修改MergedBeanDefinition,
                    // Autowired注解正是通过此方法实现注入类型的预解析
                    // 允许后置处理器修改合并的bean定义 MergedBeanDefinitionPostProcessor
                    // 第三次调用后置处理器
                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                }
                catch (Throwable ex) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "Post-processing of merged bean definition failed", ex);
                }
                mbd.postProcessed = true;
            }
        }

        // 急切地缓存单例,以便能够解析循环引用,甚至在由生命周期接口(如BeanFactoryAware)触发时也是如此。
        // 判断是否需要提早曝光实例:单例 && 允许循环依赖 && 当前bean正在创建中
        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                isSingletonCurrentlyInCreation(beanName));
        if (earlySingletonExposure) {
            if (logger.isTraceEnabled()) {
                logger.trace("Eagerly caching bean '" + beanName +
                        "' to allow for resolving potential circular references");
            }
            // 提前曝光beanName的ObjectFactory,用于解决循环引用
            // 应用后置处理器SmartInstantiationAwareBeanPostProcessor,允许返回指定bean的早期引用,若没有则直接返回bean
            // 解决循环依赖 SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference
            // 第四次调用后置处理器
            addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
        }

        // 初始化bean实例。
        Object exposedObject = bean;
        try {
            // 对bean进行属性填充;其中,可能存在依赖于其他bean的属性,则会递归初始化依赖的bean实例
            // 第五次、第六次调用后置处理器
            populateBean(beanName, mbd, instanceWrapper);
            // 对bean进行初始化
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
        catch (Throwable ex) {
            if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
                throw (BeanCreationException) ex;
            }
            else {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
            }
        }

        if (earlySingletonExposure) {
            // 如果允许提前曝光实例,则进行循环依赖检查
            Object earlySingletonReference = getSingleton(beanName, false);
            // earlySingletonReference只有在当前解析的bean存在循环依赖的情况下才会不为空
            if (earlySingletonReference != null) {
                if (exposedObject == bean) {
                    // 如果exposedObject没有在initializeBean方法中被增强,则不影响之前的循环引用
                    exposedObject = earlySingletonReference;
                }
                else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                    // 如果exposedObject在initializeBean方法中被增强 && 不允许在循环引用的情况下使用注入原始bean实例
                    // && 当前bean有被其他bean依赖

                    // 拿到依赖当前bean的所有bean的beanName数组
                    String[] dependentBeans = getDependentBeans(beanName);
                    Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
                    for (String dependentBean : dependentBeans) {
                        // 尝试移除这些bean的实例,因为这些bean依赖的bean已经被增强了,他们依赖的bean相当于脏数据
                        if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                            // 移除失败的添加到 actualDependentBeans
                            actualDependentBeans.add(dependentBean);
                        }
                    }
                    if (!actualDependentBeans.isEmpty()) {
                        // 如果存在移除失败的,则抛出异常,因为存在bean依赖了“脏数据”
                        throw new BeanCurrentlyInCreationException(beanName,
                                "Bean with name '" + beanName + "' has been injected into other beans [" +
                                StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                                "] in its raw version as part of a circular reference, but has eventually been " +
                                "wrapped. This means that said other beans do not use the final version of the " +
                                "bean. This is often the result of over-eager type matching - consider using " +
                                "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                    }
                }
            }
        }

        // 将bean注册为一次性的。
        try {
            // 注册用于销毁的bean,执行销毁操作的有三种:自定义destroy方法、DisposableBean接口、DestructionAwareBeanPostProcessor
            // 将bean注册为可以销毁 DestructionAwareBeanPostProcessor bean的销毁后置处理器
            // 第九次调用后置处理器
            registerDisposableBeanIfNecessary(beanName, bean, mbd);
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
        }

        // 完成创建并返回
        return exposedObject;
    }

首先,先移除未完成的FactoryBean实例的缓存,因为 goodsService 是一个普通的bean ,所以 this.factoryBeanInstanceCache.remove(beanName) 执行的结果为 null

第二,创建 bean 实例,调用 createBeanInstance 方法。代码如下:

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
        // 确保此时bean类已经被解析。
        // beanClass = class com.yunfan.bean.instantiation.simple.GoodsService
        Class<?> beanClass = resolveBeanClass(mbd, beanName);

        if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
            // beanClass不为空 && beanClass不是公开类(不是public修饰) && 该bean不允许访问非公共构造函数和方法,则抛异常
            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                    "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
        }

        // 返回创建bean实例的回调(如果有的话)。
        // instanceSupplier = null
        Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
        if (instanceSupplier != null) {
            return obtainFromSupplier(instanceSupplier, beanName);
        }

        // 如果存在工厂方法则使用工厂方法实例化bean对象
        // mbd.getFactoryMethodName() = null
        if (mbd.getFactoryMethodName() != null) {
            return instantiateUsingFactoryMethod(beanName, mbd, args);
        }

        // Shortcut when re-creating the same bean...
        // 英文注释翻译:重新创建相同的bean时的快捷方式…
        // resolved: 构造函数或工厂方法是否已经解析过
        boolean resolved = false;
        // autowireNecessary: 是否需要自动注入(即是否需要解析构造函数参数)
        boolean autowireNecessary = false;
        if (args == null) {
            synchronized (mbd.constructorArgumentLock) {
                // mbd.resolvedConstructorOrFactoryMethod 用于缓存已解析构造函数或工厂方法的包可见字段。
                // 此处 mbd.resolvedConstructorOrFactoryMethod = null
                if (mbd.resolvedConstructorOrFactoryMethod != null) {
                    // 如果resolvedConstructorOrFactoryMethod缓存不为空,则将resolved标记为已解析
                    resolved = true;
                    // 根据constructorArgumentsResolved判断是否需要自动注入
                    autowireNecessary = mbd.constructorArgumentsResolved;
                }
            }
        }
        // 因为 mbd.resolvedConstructorOrFactoryMethod = null 所以 resolved = false,程序不会进入 if 分支
        if (resolved) {
            // 如果已经解析过,则使用resolvedConstructorOrFactoryMethod缓存里解析好的构造函数方法
            if (autowireNecessary) {
                // 需要自动注入,则执行构造函数自动注入
                return autowireConstructor(beanName, mbd, null, null);
            }
            else {
                // 否则使用默认的构造函数进行bean的实例化
                return instantiateBean(beanName, mbd);
            }
        }

        // 应用后置处理器SmartInstantiationAwareBeanPostProcessor,可以得到bean的候选构造函数,如@Autowire 注解的构造方法, 然后使用该构造函数进行创建对象。
        // 自动装配的候选者构造器 SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
        // 第二次调用后置处理器,这个方法用来推断构造函数,实际使用的实现SmartInstantiationAwareBeanPostProcessor接口的AutowiredAnnotationBeanPostProcess后置处理器去做的。
        // 此处 ctors = null
        Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
        // AutowireMode设置为3,采用构造器贪婪模式
        if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
                mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
            // 如果ctors不为空 || mbd的注入方式为AUTOWIRE_CONSTRUCTOR || mdb定义了构造函数的参数值 || args不为空,则执行构造函数自动注入
            return autowireConstructor(beanName, mbd, ctors, args);
        }

        // 默认构造的首选构造函数 ctors = null
        ctors = mbd.getPreferredConstructors();
        if (ctors != null) {
            return autowireConstructor(beanName, mbd, ctors, null);
        }

        // 没有特殊处理,则使用默认的构造函数进行bean的实例化
        // 即无参构造器 通过反射调用无参构造函数进行创建
        return instantiateBean(beanName, mbd);
    }

createBeanInstance 方法中有一个第二次调用后置处理器,需要注意一下,即Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); 这个方法用来推断构造函数,实际使用的实现SmartInstantiationAwareBeanPostProcessor 接口的AutowiredAnnotationBeanPostProcess 后置处理器去做的。

第三,第三次调用后置处理器 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 该方法实际调用了 MergedBeanDefinitionPostProcessor的 方法:postProcessMergedBeanDefinition,用来缓存注解信息。

第四,即第四次调用后置处理器 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 调用了 SmartInstantiationAwareBeanPostProcessor 后置处理器的 getEarlyBeanReference(exposedObject, beanName) 方法 ,这个方法是来解决循环依赖问题的

第五,即第五次调用后置处理器, 在 populateBean(beanName, mbd, instanceWrapper); 方法里调用了后置处理器 InstantiationAwareBeanPostProcessor 的方法 postProcessAfterInstantiation(bw.getWrappedInstance(), beanName) 判断是否需要填充属性,goodsService 需要填充的属性个数为零,但并不是不允许修改bean的属性,所以不会忽略直接返回

第六,即第六次调用后置处理器,在 populateBean(beanName, mbd, instanceWrapper); 方法里调用了后置处理器 InstantiationAwareBeanPostProcessor 的方法 postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); 进行属性填充前的处理

第七,即第七次调用后置处理器,在方法exposedObject = initializeBean(beanName, exposedObject, mbd)wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 调用了 BeanPostProcessor 的方法 postProcessBeforeInitialization(result, beanName) 对bean实例进行包装

第八,即第七次调用后置处理器,在方法exposedObject = initializeBean(beanName, exposedObject, mbd)wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); 调用了 BeanPostProcessor 的方法 postProcessAfterInitialization(result, beanName)

第九,即第九次调用后置处理器,在方法 registerDisposableBeanIfNecessary(beanName, bean, mbd); 中 将bean注册为可以销毁 DestructionAwareBeanPostProcessor bean的销毁后置处理器

上一篇下一篇

猜你喜欢

热点阅读