Spring容器(IOC)源码解析(二)

一 回顾

我们在上一篇(Spring容器(IOC)源码解析(一))已经看了Spring如何从XML配置文件加载为BeanDefinition并返回BeanFactory。

b7df70958d1a9ab8d87cafb477bdefe2.jpeg

上图我们可以看出我们已经看完了粉色部分,这篇文章我们介绍剩余部分。

二 源码解析

我们回到refresh()方法接着往下看

AbstractApplicationContext.calss

// refresh()函数中包含了几乎所有的ApplicationContext中提供的全部功能
  @Override
  public void refresh() throws BeansException, IllegalStateException {
    // 加锁,在创建容器过程中防止出现重复创建和销毁
    synchronized (this.startupShutdownMonitor) {
      // 步骤记录有关在ApplicationStartup期间发生的特定阶段或操作的指标。
      // StartupStep的生命周期如下:
      // 1 该步骤是通过调用application.startup()来创建并被分配一个唯一的id 。
      // 2 然后我们可以在处理过程中使用StartupStep.Tags添加一些附加信息
      // 3 结束需要调用contextRefresh.end()标记
      // 实现可以跟踪“执行时间”或步骤的其他指标。
      // Spring5.3才开始有;主要对创建容器过程做一个记录标记,调用开始标记
      StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");


      // 准备刷新容器
      // 准备工作,记录下容器的启动时间、标记“已启动”状态、处理配置文件中的占位符
      prepareRefresh();


      // 通知子类刷新内部bean工厂,初始化BeanFactory并进行XML文件的解析、读取
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();


      // Prepare the bean factory for use in this context.
      // 注1 准备beanFactory
      // 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
      prepareBeanFactory(beanFactory);


      try {
        // 【这里需要知道 BeanFactoryPostProcessor 这个知识点,Bean 如果实现了此接口,
        // 那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法。】
 
        // 这里是提供给子类的扩展点,到这里的时候,所有的 Bean 都加载、注册完成了,但是都还没有初始化
        // 具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类或做点什么事
        // Allows post-processing of the bean factory in context subclasses.
        postProcessBeanFactory(beanFactory);


        StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
        // Invoke factory processors registered as beans in the context.
        // 调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法
        invokeBeanFactoryPostProcessors(beanFactory);


        // Register bean processors that intercept bean creation.
        // 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
        // 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
        // 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
        registerBeanPostProcessors(beanFactory);
        beanPostProcess.end();


        // Initialize message source for this context.
        // 初始化当前 ApplicationContext 的 MessageSource,国际化
        initMessageSource();


        // Initialize event multicaster for this context.
        // 初始化当前 ApplicationContext 的事件广播器
        initApplicationEventMulticaster();


        // Initialize other special beans in specific context subclasses.
        // 从方法名就可以知道,典型的模板方法(钩子方法),
        // 具体的子类可以在这里初始化一些特殊的 Bean(在初始化 singleton beans 之前)
        onRefresh();


        // Check for listener beans and register them.
        // 注册事件监听器,监听器需要实现 ApplicationListener 接口。这也不是我们的重点,过
        registerListeners();


        // Instantiate all remaining (non-lazy-init) singletons.
        // 注2  重点,重点,重点
        // 初始化所有的 singleton beans
        //(lazy-init 的除外)
        finishBeanFactoryInitialization(beanFactory);


        // Last step: publish corresponding event.
        // 最后,广播事件,ApplicationContext 初始化完成
        finishRefresh();
      }


      catch (BeansException ex) {
        if (logger.isWarnEnabled()) {
          logger.warn("Exception encountered during context initialization - " +
              "cancelling refresh attempt: " + ex);
        }


        // Destroy already created singletons to avoid dangling resources.
        // 销毁已经初始化的 singleton 的 Beans,以免有些 bean 会一直占用资源
        destroyBeans();


        // Reset 'active' flag.
        cancelRefresh(ex);


        // Propagate exception to caller.
        throw ex;
      }


      finally {
        // Reset common introspection caches in Spring's core, since we
        // might not ever need metadata for singleton beans anymore...
        resetCommonCaches();
        contextRefresh.end();
      }
    }
  }
  
  // 注1 准备beanFactory
  // 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
  protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // Tell the internal bean factory to use the context's class loader etc.
    // 设置 BeanFactory 的类加载器,我们知道 BeanFactory 需要加载类,也就需要类加载器,
    // 这里设置为当前 ApplicationContext 的类加载器
    beanFactory.setBeanClassLoader(getClassLoader());
    // 由spring.spel.ignore系统属性控制的布尔标志,指示 Spring 忽略 SpEL,即不初始化 SpEL 基础结构。
    // 默认值为“假”。
    if (!shouldIgnoreSpel) {
      beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    }
    beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));


    // Configure the bean factory with context callbacks.
    // 添加一个 BeanPostProcessor,这个 processor 比较简单,
    // 实现了 Aware 接口的几个特殊的 beans 在初始化的时候,这个 processor 负责回调
    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    // 忽略给定的自动装配依赖接口。
    // 这通常由应用程序上下文用于注册以其他方式解析的依赖项,例如通过 BeanFactoryAware 的 BeanFactory 或通过 ApplicationContextAware 的 ApplicationContext。
    // 默认情况下,仅忽略 BeanFactoryAware 接口。对于要忽略的其他类型,请为每种类型调用此方法
    beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);


    // BeanFactory interface not registered as resolvable type in a plain factory.
    // MessageSource registered (and found for autowiring) as a bean.
    // 使用相应的自动装配值注册一个特殊的依赖类型。
    // 这适用于应该是可自动装配但在工厂中未定义为 bean 的工厂/上下文引用:例如,ApplicationContext 类型的依赖项解析为 bean 所在的 ApplicationContext 实例。
    // 注意:在普通的 BeanFactory 中没有注册这样的默认类型,甚至没有为 BeanFactory 接口本身注册
    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    beanFactory.registerResolvableDependency(ApplicationContext.class, this);


    // Register early post-processor for detecting inner beans as ApplicationListeners.
    // 这个 BeanPostProcessor 也很简单,在 bean 实例化后,如果是 ApplicationListener 的子类,
    // 那么将其添加到 listener 列表中,可以理解成:注册事件监听器
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));


    // Detect a LoadTimeWeaver and prepare for weaving, if found.
    // 这里涉及到特殊的 bean,名为:loadTimeWeaver
    if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      // Set a temporary ClassLoader for type matching.
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }


    /**
    * 从下面几行代码我们可以知道,Spring 往往很 "智能" 就是因为它会帮我们默认注册一些有用的 bean,
    * 我们也可以选择覆盖
    */


    // Register default environment beans.
    // 如果没有定义 "environment" 这个 bean,那么 Spring 会 "手动" 注册一个
    if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    }
    // 如果没有定义 "systemProperties" 这个 bean,那么 Spring 会 "手动" 注册一个
    if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    }
    // 如果没有定义 "systemEnvironment" 这个 bean,那么 Spring 会 "手动" 注册一个
    if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    }
    // 如果没有定义 "applicationStartup" 这个 bean,那么 Spring 会 "手动" 注册一个
    if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
      beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
    }
  }
  
  // 注2  初始化所有的 singleton beans;(lazy-init 的除外)
  protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    // Initialize conversion service for this context.
    // 首先,初始化名字为 conversionService 的 Bean。
    // 初始化的动作包装在 beanFactory.getBean(...) 中
    if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
        beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
      beanFactory.setConversionService(
          beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
    }


    // Register a default embedded value resolver if no BeanFactoryPostProcessor
    // (such as a PropertySourcesPlaceholderConfigurer bean) registered any before:
    // at this point, primarily for resolution in annotation attribute values.
    // 如果之前没有注册任何 BeanFactoryPostProcessor(例如 PropertySourcesPlaceholderConfigurer bean),
    // 则注册一个默认的嵌入值解析器,主要用于注释属性值的解析。
    if (!beanFactory.hasEmbeddedValueResolver()) {
      beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
    }


    // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
    // 先初始化 LoadTimeWeaverAware 类型的 Bean
    // 一般用于织入第三方模块,在 class 文件载入 JVM 的时候动态织入
    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
    for (String weaverAwareName : weaverAwareNames) {
      getBean(weaverAwareName);
    }


    // Stop using the temporary ClassLoader for type matching.
    // 停止使用类型匹配的临时类加载器 
    beanFactory.setTempClassLoader(null);


    // Allow for caching all bean definition metadata, not expecting further changes.
    // 没什么别的目的,因为到这一步的时候,Spring 已经开始预初始化 singleton beans 了,
    // 肯定不希望这个时候还出现 bean 定义解析、加载、注册。
    // 冻结所有 bean 定义,表明注册的 bean 定义不会被进一步修改或后处理。
    // 这允许工厂积极缓存 bean 定义元数据
    beanFactory.freezeConfiguration();


    // Instantiate all remaining (non-lazy-init) singletons.
    // 开始初始化剩下的
    beanFactory.preInstantiateSingletons();
  }

DefaultListableBeanFactory.class -> beanFactory.preInstantiateSingletons();

// 初始化剩余bean(除懒加载外)
  @Override
  public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
      logger.trace("Pre-instantiating singletons in " + this);
    }


    // Iterate over a copy to allow for init methods which in turn register new bean definitions.
    // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
    // 获取所有的bean定义的名字,并保存在集合List里面。
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);


    // Trigger initialization of all non-lazy singleton beans...
    // 触发所有的非懒加载的 singleton beans 的初始化操作              
   for (String beanName : beanNames) {
      // 合并父 Bean 中的配置,注意 <bean id="" class="" parent="" /> 中的 parent
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      // 非抽象、非懒加载的 singletons。如果配置了 'abstract = true',那是不需要初始化的
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
        // 处理 FactoryBean
        // 官方注释对FactoryBean解释:由BeanFactory中使用的对象实现的接口,这些对象本身是单个对象的工厂。 如果一个 bean 实现了这个接口,它就被用作一个对象暴露的工厂,而不是直接作为一个将暴露自己的 bean 实例。
        // 注意:实现此接口的 bean 不能用作普通 bean。FactoryBean 以 bean 样式定义,但为 bean 引用公开的对象 ( getObject() ) 始终是它创建的对象。
        // FactoryBeans 可以支持单例和原型,并且可以根据需要懒惰地或在启动时急切地创建对象。SmartFactoryBean接口允许公开更细粒度的行为元数据。
        // 该接口在框架本身中被大量使用,例如用于 AOP org.springframework.aop.framework.ProxyFactoryBean或org.springframework.jndi.JndiObjectFactoryBean 。它也可以用于自定义组件;然而,这仅适用于基础设施代码。
        // FactoryBean是一个程序化契约。实现不应该依赖于注释驱动的注入或其他反射设施。getObjectType() getObject()调用可能会在引导过程的早期到达,甚至在任何后处理器设置之前。如果您需要访问其他 bean,请实现BeanFactoryAware并以编程方式获取它们。
        // 容器只负责管理FactoryBean 实例的生命周期,而不负责管理FactoryBean 创建的对象的生命周期。因此,暴露的 bean 对象(例如java.io.Closeable.close()上的 destroy 方法不会被自动调用。相反,FactoryBean 应该实现DisposableBean并将任何此类关闭调用委托给底层对象。
        // 最后,FactoryBean 对象参与包含 BeanFactory 的 bean 创建同步。除了 FactoryBean 本身(或类似的)内部的延迟初始化之外,通常不需要内部同步
        if (isFactoryBean(beanName)) {
          // FactoryBean 的话,在 beanName 前面加上 ‘&’ 符号。再调用 getBean
          Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
          if (bean instanceof FactoryBean) {
            FactoryBean<?> factory = (FactoryBean<?>) bean;
            // 判断当前 FactoryBean 是否是 SmartFactoryBean 的实现
            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 {
          // 对于普通的 Bean,只要调用 getBean(beanName) 这个方法就可以进行初始化了
          getBean(beanName);
        }
      }
    }


    // Trigger post-initialization callback for all applicable beans...
    // 到这里说明所有的非懒加载的 singleton beans 已经完成了初始化
    // 如果我们定义的 bean 是实现了 SmartInitializingSingleton 接口的,那么在这里得到回调,忽略
    for (String beanName : beanNames) {
      Object singletonInstance = getSingleton(beanName);
      if (singletonInstance instanceof SmartInitializingSingleton) {
        StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
            .tag("beanName", beanName);
        SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
        if (System.getSecurityManager() != null) {
          AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            smartSingleton.afterSingletonsInstantiated();
            return null;
          }, getAccessControlContext());
        }
        else {
          smartSingleton.afterSingletonsInstantiated();
        }
        smartInitialize.end();
      }
    }
  }

AbstractBeanFactory.class -> getBean(beanName);

public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
  }
  // 我们在剖析初始化 Bean 的过程,但是 getBean 方法我们经常是用来从容器中获取 Bean 用的
  // 已经初始化过了就从容器中直接返回,否则就先初始化再返回
  protected <T> T doGetBean(
      String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
      throws BeansException {
    // 获取一个 beanName,处理两种情况,一个是前面说的 FactoryBean(前面带 ‘&’),
    // 一个是别名问题,因为这个方法是 getBean,获取 Bean 用的,你要是传一个别名进来,是完全可以的
    String beanName = transformedBeanName(name);
    // 注意跟着这个,这个是返回值
    Object beanInstance;


    // Eagerly check singleton cache for manually registered singletons.
    // 检查下是不是已经创建过了
    // 快速判断单例缓存中是否存在该bean,如果存在则返回单例bean;否则返回null
    Object sharedInstance = getSingleton(beanName);
    // 这里说下 args 呗,虽然看上去一点不重要。前面我们一路进来的时候都是 getBean(beanName),
    // 所以 args 其实是 null 的,但是如果 args 不为空的时候,那么意味着调用方不是希望获取 Bean,而是创建 Bean
    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 的话,直接返回 sharedInstance,
      // 如果是 FactoryBean 的话,返回它创建的那个实例对象
      beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }


    else {
      // Fail if we're already creating this bean instance:
      // We're assumably within a circular reference.
      // 当前线程已经创建过了此 beanName 的 prototype 类型的 bean,那么抛异常
      if (isPrototypeCurrentlyInCreation(beanName)) {
        throw new BeanCurrentlyInCreationException(beanName);
      }


      // Check if bean definition exists in this factory.
      // 检查一下这个 BeanDefinition 在容器中是否存在
      BeanFactory parentBeanFactory = getParentBeanFactory();
      if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
        // Not found -> check parent.
        // 如果当前容器不存在这个 BeanDefinition,试试父容器中有没有
        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);
        }
      }


      // 标记该bean已经被创建
      if (!typeCheckOnly) {
        // typeCheckOnly 为 false,将当前 beanName 放入一个 alreadyCreated 的 Set 集合中。
        markBeanAsCreated(beanName);
      }


      StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
          .tag("beanName", name);
      /*
       * 到这里的话,要准备创建 Bean 了,对于 singleton 的 Bean 来说,容器中还没创建过此 Bean;
       * 对于 prototype 的 Bean 来说,本来就是要创建一个新的 Bean。
       */ 
      try {
        if (requiredType != null) {
          beanCreation.tag("beanType", requiredType::toString);
        }
        // 返回bean的定义信息,包括bean的scope、依赖、是否进行懒加载等定义
        RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
        checkMergedBeanDefinition(mbd, beanName, args);


        // Guarantee initialization of beans that the current bean depends on.
        // 先初始化依赖的所有 Bean,这个很好理解。
        // 注意,这里的依赖指的是 depends-on 中定义的依赖
        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 + "'");
            }
            // 注册一下依赖关系
            registerDependentBean(dep, beanName);
            try {
              // 先初始化被依赖项
              getBean(dep);
            }
            catch (NoSuchBeanDefinitionException ex) {
              throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                  "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
            }
          }
        }


        // Create bean instance.
        // 创建 singleton 的实例
        // 开始创建这个bean,注意这里使用的lambda表达式,传入的是一个AbstracBeanFactory
        if (mbd.isSingleton()) {
          sharedInstance = getSingleton(beanName, () -> {
            try {
              // 执行创建 Bean
              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.
              // 从单例缓存中显式删除实例:它可能已被创建过程急切地放在那里,以允许循环引用解析。
              // 还要删除收到对 bean 的临时引用的所有 bean
              destroySingleton(beanName);
              throw ex;
            }
          });
          // 获取给定 bean 实例的对象,如果是 FactoryBean,则是 bean 实例本身或其创建的对象
          beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
        }


        // 创建 prototype 的实例
        else if (mbd.isPrototype()) {
          // It's a prototype -> create a new instance.
          Object prototypeInstance = null;
          try {
            // 创建原型之前的回调。默认实现将原型注册为当前正在创建
            beforePrototypeCreation(beanName);
            // 执行创建 Bean
            prototypeInstance = createBean(beanName, mbd, args);
          }
          finally {
            afterPrototypeCreation(beanName);
          }
          beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
        }
        // 如果不是 singleton 和 prototype 的话,需要委托给相应的实现类来处理
        else {
          String scopeName = mbd.getScope();
          if (!StringUtils.hasLength(scopeName)) {
            throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
          }
          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 {
                // 执行创建 Bean
                return createBean(beanName, mbd, args);
              }
              finally {
                afterPrototypeCreation(beanName);
              }
            });
            beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
          }
          catch (IllegalStateException ex) {
            throw new ScopeNotActiveException(beanName, scopeName, ex);
          }
        }
      }
      catch (BeansException ex) {
        beanCreation.tag("exception", ex.getClass().toString());
        beanCreation.tag("message", String.valueOf(ex.getMessage()));
        cleanupAfterBeanCreationFailure(beanName);
        throw ex;
      }
      finally {
        beanCreation.end();
      }
    }
    // 检查所需类型是否与实际 bean 实例的类型匹配
    // requiredType如果是bean类型,转换后返回,如果为空或不是该类型直接返回
    return adaptBeanInstance(name, beanInstance, requiredType);
  }

DefaultSingletonBeanRegistry.class -> getSingleton(beanName);

// 尝试从缓存中获取单例对象,如果缓存中有该单例对象,并且该对象正在被创建,则从缓存中获取。
  @Override
  @Nullable
  public Object getSingleton(String beanName) {
    return getSingleton(beanName, true);
  }
  
  @Nullable
  protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    // Quick check for existing instance without full singleton lock
    // singletonObjects是一个单例缓存,是一个ConcurrentHashMap
    Object singletonObject = this.singletonObjects.get(beanName);
    // 从缓存中获取单例对象、判断对象是否正在被创建
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
      singletonObject = this.earlySingletonObjects.get(beanName);
      if (singletonObject == null && allowEarlyReference) {
        synchronized (this.singletonObjects) {
          // Consistent creation of early reference within full singleton lock
          singletonObject = this.singletonObjects.get(beanName);
          if (singletonObject == null) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null) {
              ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
              if (singletonFactory != null) {
                singletonObject = singletonFactory.getObject();
                this.earlySingletonObjects.put(beanName, singletonObject);
                this.singletonFactories.remove(beanName);
              }
            }
          }
        }
      }
    }
    return singletonObject;
  }
  
  public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(beanName, "Bean name must not be null");
    // 对于单例bean的获取,是要获得“单例缓存”的锁的,否则无法操作bean的获取。
    synchronized (this.singletonObjects) {
      Object singletonObject = this.singletonObjects.get(beanName);
      if (singletonObject == null) {
        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创建之前的回调方法
        beforeSingletonCreation(beanName);
        boolean newSingleton = false;
        boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
        if (recordSuppressedExceptions) {
          this.suppressedExceptions = new LinkedHashSet<>();
        }
        try {
          // 尝试从单例工厂获取单例bean
          // 这里的singletonFactory是由方法参数传进来的一个lambda表达式,这个singletonFactory是一个AbstractAutowireCapableBeanFactory实例
          singletonObject = singletonFactory.getObject();
          newSingleton = true;
        }
        catch (IllegalStateException ex) {
          // Has the singleton object implicitly appeared in the meantime ->
          // if yes, proceed with it since the exception indicates that state.
          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;
          }
          // 单例bean创建过后的回调方法
          afterSingletonCreation(beanName);
        }
        if (newSingleton) {
          addSingleton(beanName, singletonObject);
        }
      }
      return singletonObject;
    }
  }

AbstractAutowireCapableBeanFactory.class -> createBean(beanName, mbd, args)

// 创建 bean 实例、填充 bean 实例、应用后处理器等
  protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
      throws BeanCreationException;
      
  @Override
  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;


    // Make sure bean class is actually resolved at this point, and
    // clone the bean definition in case of a dynamically resolved Class
    // which cannot be stored in the shared merged bean definition.
    // 确保 BeanDefinition 中的 Class 被加载
    // 调用实例化前的后置处理器,在这个后置处理器中可以对bean进行处理,可以返回由后置处理器处理的bean而不是被实例化的bean。
    // 换句话说就是这里可以拦截住bean的实例化
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
      mbdToUse = new RootBeanDefinition(mbd);
      mbdToUse.setBeanClass(resolvedClass);
    }


    // Prepare method overrides.
    try {
      // 准备方法覆写,这里又涉及到一个概念:MethodOverrides,它来自于 bean 定义中的 <lookup-method /> 和 <replaced-method />
      mbdToUse.prepareMethodOverrides();
    }
    catch (BeanDefinitionValidationException ex) {
      throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
          beanName, "Validation of method overrides failed", ex);
    }


    try {
      // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
      // 让 BeanPostProcessor 在这一步有机会返回代理,而不是 bean 实例,
      // 要彻底了解清楚这个,需要去看 InstantiationAwareBeanPostProcessor 接口
      Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
      if (bean != null) {
        return bean;
      }
    }
    catch (Throwable ex) {
      throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
          "BeanPostProcessor before instantiation of bean failed", ex);
    }


    try {
      // 注1 创建 bean
      Object beanInstance = doCreateBean(beanName, mbdToUse, args);
      if (logger.isTraceEnabled()) {
        logger.trace("Finished creating instance of bean '" + beanName + "'");
      }
      return beanInstance;
    }
    catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
      // A previously detected exception with proper bean creation context already,
      // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
      throw ex;
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
    }
  }
  
  // 注1 创建bean
  // 实际创建指定的bean。预创建处理此时已经发生,例如检查postProcessBeforeInstantiation回调。
  // 区分默认 bean 实例化、工厂方法的使用和自动装配构造函数
  protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
      throws BeanCreationException {


    // Instantiate the bean.
    // 创建一个包装类,用于包装真正要创建的bean。
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
      instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
      // 注1 使用适当的实例化策略例如:工厂方法、构造函数自动装配或者简单实例化 来为指定bean创建新的实例。这里仅仅是简单的实例化,为bean设置默认初始值
      // 也就是name为null,age为0。此时instanceWrapper还只是一个包装bean,并不是一个真正意义上的bean。
      instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    // 只需要在BeanWrapper里取出WrapperInstance即可。
    // 接下来就是要拿这个创建好的bean和BeanDefinition进行实例化
    Object bean = instanceWrapper.getWrappedInstance();
    // 获取bean的类型
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
      mbd.resolvedTargetType = beanType;
    }


    // Allow post-processors to modify the merged bean definition.
    // 调用后置处理器去修改bean的定义信息
    synchronized (mbd.postProcessingLock) {
      if (!mbd.postProcessed) {
        try {
          applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
        }
        catch (Throwable ex) {
          throw new BeanCreationException(mbd.getResourceDescription(), beanName,
              "Post-processing of merged bean definition failed", ex);
        }
        mbd.postProcessed = true;
      }
    }


    // Eagerly cache singletons to be able to resolve circular references
    // even when triggered by lifecycle interfaces like BeanFactoryAware.
    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");
      }
      addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }


    // Initialize the bean instance.
    // 实例化一个真正使用的bean
    Object exposedObject = bean;
    try {
      // 负责属性装配,因为前面的实例只是初始化,并没有设值,这里就是设值
      populateBean(beanName, mbd, instanceWrapper);
      // 还记得 init-method 吗?还有 InitializingBean 接口?还有 BeanPostProcessor 接口?
      // 这里就是处理 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);
      if (earlySingletonReference != null) {
        if (exposedObject == bean) {
          exposedObject = earlySingletonReference;
        }
        else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
          String[] dependentBeans = getDependentBeans(beanName);
          Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
          for (String dependentBean : dependentBeans) {
            if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
              actualDependentBeans.add(dependentBean);
            }
          }
          if (!actualDependentBeans.isEmpty()) {
            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 " +
                "'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
          }
        }
      }
    }


    // Register bean as disposable.
    try {
      registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }


    return exposedObject;
  }
  
  // 注1 使用适当的实例化策略例如:工厂方法、构造函数自动装配或者简单实例化 来为指定bean创建新的实例。这里仅仅是简单的实例化,为bean设置默认初始值
  // 也就是name为null,age为0。此时instanceWrapper还只是一个包装bean,并不是一个真正意义上的bean。
  protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // Make sure bean class is actually resolved at this point.
    // 确保已经加载了此 class
    Class<?> beanClass = resolveBeanClass(mbd, beanName);


    // 校验一下这个类的访问权限
    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
      throw new BeanCreationException(mbd.getResourceDescription(), beanName,
          "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    }


    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
      return obtainFromSupplier(instanceSupplier, beanName);
    }


    if (mbd.getFactoryMethodName() != null) {
      // 采用工厂方法实例化,注意,不是 FactoryBean
      return instantiateUsingFactoryMethod(beanName, mbd, args);
    }


    // Shortcut when re-creating the same bean...   
    // 如果不是第一次创建,比如第二次创建 prototype bean。
    // 这种情况下,我们可以从第一次创建知道,采用无参构造函数,还是构造函数依赖注入 来完成实例化
    boolean resolved = false;
    boolean autowireNecessary = false;
    if (args == null) {
      synchronized (mbd.constructorArgumentLock) {
        if (mbd.resolvedConstructorOrFactoryMethod != null) {
          resolved = true;
          autowireNecessary = mbd.constructorArgumentsResolved;
        }
      }
    }
    if (resolved) {
      if (autowireNecessary) {
        // 构造函数依赖注入
        return autowireConstructor(beanName, mbd, null, null);
      }
      else {
        // 无参构造函数
        return instantiateBean(beanName, mbd);
      }
    }


    // Candidate constructors for autowiring?
    // 判断是否采用有参构造函数
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    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);
    }


    // No special handling: simply use no-arg constructor.
    // 注1 调用无参构造函数
    return instantiateBean(beanName, mbd);
  }
  
  // 注1 调用无参构造函数
  protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
    try {
      Object beanInstance;
      if (System.getSecurityManager() != null) {
        beanInstance = AccessController.doPrivileged(
            (PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this),
            getAccessControlContext());
      }
      else {
        // 实例化
        beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
      }
      // 包装一下,返回
      BeanWrapper bw = new BeanWrapperImpl(beanInstance);
      initBeanWrapper(bw);
      return bw;
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
    }
  }

SimpleInstantiationStrategy.class -> beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);

// 返回此工厂中具有给定名称的 bean 实例
  @Override
  public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    // Don't override the class with CGLIB if no overrides.
    // 如果不存在方法覆写,那就使用 java 反射进行实例化,否则使用 CGLIB
    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.
      // 存在方法覆写,利用 CGLIB 来完成实例化,需要依赖于 CGLIB 生成子类
      return instantiateWithMethodInjection(bd, beanName, owner);
    }
  }

AbstractAutowireCapableBeanFactory.class -> populateBean(beanName, mbd, instanceWrapper)

// 对创建出的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.
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
      for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
        if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
          return;
        }
      }
    }
    // bean 实例的所有属性都在这里
    PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);


    int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    // 如果设置的是自动装配模式,则由自动装配来进行赋值
    if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
      MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
      // Add property values based on autowire by name if applicable.
      // 通过bean名自动装配
      if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
        // 通过名字找到所有属性值,如果是 bean 依赖,先初始化依赖的 bean。记录依赖关系
        autowireByName(beanName, mbd, bw, newPvs);
      }
      // Add property values based on autowire by type if applicable.
      // 通过bean类型自动装配
      if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
        autowireByType(beanName, mbd, bw, newPvs);
      }
      pvs = newPvs;
    }


    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);


    PropertyDescriptor[] filteredPds = null;
    if (hasInstAwareBpps) {
      if (pvs == null) {
        pvs = mbd.getPropertyValues();
      }
      for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
        PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
        if (pvsToUse == null) {
          if (filteredPds == null) {
            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
          }
          // 这里有个非常有用的 BeanPostProcessor 进到这里: AutowiredAnnotationBeanPostProcessor
          // 对采用 @Autowired、@Value 注解的依赖进行设值
          pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
          if (pvsToUse == null) {
            return;
          }
        }
        pvs = pvsToUse;
      }
    }
    if (needsDepCheck) {
      if (filteredPds == null) {
        filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
      }
      checkDependencies(beanName, mbd, filteredPds, pvs);
    }


    if (pvs != null) {
      // 注1 对bean进行赋值
      applyPropertyValues(beanName, mbd, bw, pvs);
    }
  }
  
  // 注1 对bean进行赋值,使用深拷贝对bean进行填充赋值
  protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
    if (pvs.isEmpty()) {
      return;
    }


    if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
      ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
    }


    MutablePropertyValues mpvs = null;
    // 源属性值
    List<PropertyValue> original;


    if (pvs instanceof MutablePropertyValues) {
      mpvs = (MutablePropertyValues) pvs;
      if (mpvs.isConverted()) {
        // Shortcut: use the pre-converted values as-is.
        try {
          bw.setPropertyValues(mpvs);
          return;
        }
        catch (BeansException ex) {
          throw new BeanCreationException(
              mbd.getResourceDescription(), beanName, "Error setting property values", ex);
        }
      }
      original = mpvs.getPropertyValueList();
    }
    else {
      original = Arrays.asList(pvs.getPropertyValues());
    }


    TypeConverter converter = getCustomTypeConverter();
    if (converter == null) {
      converter = bw;
    }
    BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);


    // Create a deep copy, resolving any references for values.
    // 拷贝值;创建一个深拷贝副本,应用于任何bean引用此bean的情况
    List<PropertyValue> deepCopy = new ArrayList<>(original.size());
    boolean resolveNecessary = false;
    for (PropertyValue pv : original) {
      if (pv.isConverted()) {
        deepCopy.add(pv);
      }
      else {
        String propertyName = pv.getName();
        Object originalValue = pv.getValue();
        if (originalValue == AutowiredPropertyMarker.INSTANCE) {
          Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
          if (writeMethod == null) {
            throw new IllegalArgumentException("Autowire marker for property without write method: " + pv);
          }
          originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);
        }
        Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
        Object convertedValue = resolvedValue;
        boolean convertible = bw.isWritableProperty(propertyName) &&
            !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
        if (convertible) {
          convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
        }
        // Possibly store converted value in merged bean definition,
        // in order to avoid re-conversion for every created bean instance.
        // 可能在合并的bean定义中存储转换后的值,以避免为每个创建的bean实例重新转换
        if (resolvedValue == originalValue) {
          if (convertible) {
            pv.setConvertedValue(convertedValue);
          }
          deepCopy.add(pv);
        }
        else if (convertible && originalValue instanceof TypedStringValue &&
            !((TypedStringValue) originalValue).isDynamic() &&
            !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
          pv.setConvertedValue(convertedValue);
          deepCopy.add(pv);
        }
        else {
          resolveNecessary = true;
          deepCopy.add(new PropertyValue(pv, convertedValue));
        }
      }
    }
    if (mpvs != null && !resolveNecessary) {
      mpvs.setConverted();
    }


    // Set our (possibly massaged) deep copy.
    // 将深拷贝属性数组填充到beanWrapper中。这里就真正的将属性值填充到了bean上,实现了
    try {
      bw.setPropertyValues(new MutablePropertyValues(deepCopy));
    }
    catch (BeansException ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Error setting property values", ex);
    }
  }

AbstractAutowireCapableBeanFactory.class -> initializeBean(beanName, exposedObject, mbd)

// 处理回调
  protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
      AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
        invokeAwareMethods(beanName, bean);
        return null;
      }, getAccessControlContext());
    }
    else {
      // 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
      invokeAwareMethods(beanName, bean);
    }


    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
      // BeanPostProcessor 的 postProcessBeforeInitialization 回调
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }


    try {
      // 处理 bean 中定义的 init-method
      // 或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法
      invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          (mbd != null ? mbd.getResourceDescription() : null),
          beanName, "Invocation of init method failed", ex);
    }
    if (mbd == null || !mbd.isSynthetic()) {
      // BeanPostProcessor 的 postProcessAfterInitialization 回调
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }


    return wrappedBean;
  }

三 UML类图

bean初始化到实例化再到增强处理器,通知等

5cb723378a05d8392782de1737896925.png

四 总结

bf627eeb6787457e8b3b4466a693dd30.jpeg

这篇文章主要从黄色部分到完成,先进行BeanFactory增强处理,接着对bean进行初始化,填充属性,执行相关增强或init方法,bean实例化完成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值