整体流程

  1. protected <T> T doGetBean(
  2. String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
  3. throws BeansException {
  4. String beanName = transformedBeanName(name);
  5. Object bean;
  6. // Eagerly check singleton cache for manually registered singletons.
  7. Object sharedInstance = getSingleton(beanName);
  8. // 如果从缓存中拿到了实例
  9. if (sharedInstance != null && args == null) {
  10. if (logger.isTraceEnabled()) {
  11. // 判断是否是单例并且是创建中的对象。表示应该是相互引用的对象
  12. if (isSingletonCurrentlyInCreation(beanName)) {
  13. logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
  14. "' that is not fully initialized yet - a consequence of a circular reference");
  15. }
  16. else {
  17. // 创建了对象
  18. logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
  19. }
  20. }
  21. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  22. }
  23. // 从缓存中没有拿到实例
  24. else {
  25. // Fail if we're already creating this bean instance:
  26. // We're assumably within a circular reference.
  27. // 默认单例,所以该分支目前不会走
  28. if (isPrototypeCurrentlyInCreation(beanName)) {
  29. throw new BeanCurrentlyInCreationException(beanName);
  30. }
  31. // Check if bean definition exists in this factory.
  32. // 没有设置过父BeanFactory所以该分支目前也不会走
  33. BeanFactory parentBeanFactory = getParentBeanFactory();
  34. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  35. // Not found -> check parent.
  36. String nameToLookup = originalBeanName(name);
  37. if (parentBeanFactory instanceof AbstractBeanFactory) {
  38. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  39. nameToLookup, requiredType, args, typeCheckOnly);
  40. }
  41. else if (args != null) {
  42. // Delegation to parent with explicit args.
  43. return (T) parentBeanFactory.getBean(nameToLookup, args);
  44. }
  45. else if (requiredType != null) {
  46. // No args -> delegate to standard getBean method.
  47. return parentBeanFactory.getBean(nameToLookup, requiredType);
  48. }
  49. else {
  50. return (T) parentBeanFactory.getBean(nameToLookup);
  51. }
  52. }
  53. // typeCheckOnly false
  54. if (!typeCheckOnly) {
  55. // 标记为已创建,并放入alreadyCreated缓冲中
  56. markBeanAsCreated(beanName);
  57. }
  58. try {
  59. // 获取bean定义
  60. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  61. // 如果是抽象类会抛出异常 BeanIsAbstractException
  62. checkMergedBeanDefinition(mbd, beanName, args);
  63. // Guarantee initialization of beans that the current bean depends on.
  64. // 保证bean配置的依赖都已经实例化了。<bean class="xxx" depends-on="xxxx">
  65. String[] dependsOn = mbd.getDependsOn();
  66. if (dependsOn != null) {
  67. // 遍历实例化依赖的bean
  68. for (String dep : dependsOn) {
  69. if (isDependent(beanName, dep)) {
  70. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  71. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  72. }
  73. registerDependentBean(dep, beanName);
  74. try {
  75. getBean(dep);
  76. }
  77. catch (NoSuchBeanDefinitionException ex) {
  78. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  79. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
  80. }
  81. }
  82. }
  83. // Create bean instance.
  84. if (mbd.isSingleton()) {
  85. sharedInstance = getSingleton(beanName, () -> {
  86. try {
  87. return createBean(beanName, mbd, args);
  88. }
  89. catch (BeansException ex) {
  90. // Explicitly remove instance from singleton cache: It might have been put there
  91. // eagerly by the creation process, to allow for circular reference resolution.
  92. // Also remove any beans that received a temporary reference to the bean.
  93. destroySingleton(beanName);
  94. throw ex;
  95. }
  96. });
  97. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  98. }
  99. else if (mbd.isPrototype()) {
  100. // It's a prototype -> create a new instance.
  101. Object prototypeInstance = null;
  102. try {
  103. beforePrototypeCreation(beanName);
  104. prototypeInstance = createBean(beanName, mbd, args);
  105. }
  106. finally {
  107. afterPrototypeCreation(beanName);
  108. }
  109. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  110. }
  111. else {
  112. String scopeName = mbd.getScope();
  113. if (!StringUtils.hasLength(scopeName)) {
  114. throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
  115. }
  116. Scope scope = this.scopes.get(scopeName);
  117. if (scope == null) {
  118. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  119. }
  120. try {
  121. Object scopedInstance = scope.get(beanName, () -> {
  122. beforePrototypeCreation(beanName);
  123. try {
  124. return createBean(beanName, mbd, args);
  125. }
  126. finally {
  127. afterPrototypeCreation(beanName);
  128. }
  129. });
  130. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  131. }
  132. catch (IllegalStateException ex) {
  133. throw new BeanCreationException(beanName,
  134. "Scope '" + scopeName + "' is not active for the current thread; consider " +
  135. "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
  136. ex);
  137. }
  138. }
  139. }
  140. catch (BeansException ex) {
  141. cleanupAfterBeanCreationFailure(beanName);
  142. throw ex;
  143. }
  144. }
  145. // Check if required type matches the type of the actual bean instance.
  146. if (requiredType != null && !requiredType.isInstance(bean)) {
  147. try {
  148. T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
  149. if (convertedBean == null) {
  150. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  151. }
  152. return convertedBean;
  153. }
  154. catch (TypeMismatchException ex) {
  155. if (logger.isTraceEnabled()) {
  156. logger.trace("Failed to convert bean '" + name + "' to required type '" +
  157. ClassUtils.getQualifiedName(requiredType) + "'", ex);
  158. }
  159. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  160. }
  161. }
  162. return (T) bean;
  163. }

transformedBeanName

然后进入 doGetBean 方法,这里面代码很多,分成小段来看。
第一个小段:transformedBeanName 转换 bean 的名称,都给了 beanName 为啥还要转换?因为 bean 是有别名的,需要把这个别名转换成最终指向的 bean 的 beanName.
spring-beans | org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

  1. @SuppressWarnings("unchecked")
  2. protected <T> T doGetBean(
  3. String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
  4. throws BeansException {
  5. String beanName = transformedBeanName(name);
  6. Object bean;
  7. .....
  8. }
  1. protected String transformedBeanName(String name) {
  2. return canonicalName(BeanFactoryUtils.transformedBeanName(name));
  3. }

调用静态方法,这个方法还是比较容易理解的,如下所示:
spring-beans | org.springframework.beans.factory.BeanFactoryUtils#transformedBeanName

  1. public static String transformedBeanName(String name) {
  2. Assert.notNull(name, "'name' must not be null");
  3. // 如果不是FactoryBean就直接返回。(FactoryBean的开头是&)
  4. if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
  5. return name;
  6. }
  7. // 如果是FactoryBean的话,返回去掉&的名称,同时加入缓存,例如:{&hello=hello}
  8. return transformedBeanNameCache.computeIfAbsent(name, beanName -> {
  9. do {
  10. beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
  11. }
  12. while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
  13. return beanName;
  14. });
  15. }

然后是 canonicalName 方法,规范化名字,利用别名缓存把别名转换成真正的名字
spring-core | org.springframework.core.SimpleAliasRegistry#canonicalName

  1. public String canonicalName(String name) {
  2. String canonicalName = name;
  3. // Handle aliasing...
  4. String resolvedName;
  5. do {
  6. resolvedName = this.aliasMap.get(canonicalName);
  7. if (resolvedName != null) {
  8. canonicalName = resolvedName;
  9. }
  10. }
  11. while (resolvedName != null);
  12. return canonicalName;
  13. }

getSingleton

得到 bean 的名称后,从缓存中尝试获取这个bean的实例。
spring-beans | org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)

  1. @Override
  2. @Nullable
  3. public Object getSingleton(String beanName) {
  4. // 参数true表示允许早期依赖
  5. return getSingleton(beanName, true);
  6. }

进入方法,从三个缓存中进行判断
spring-beans | org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton

  1. @Nullable
  2. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  3. // Quick check for existing instance without full singleton lock
  4. // 从单例bean缓存中查找。称为:第一级缓存,用于存放完全初始化好的bean
  5. Object singletonObject = this.singletonObjects.get(beanName);
  6. // 从"bean状态:创建中"的缓存中查找。
  7. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  8. // 从早期单例bean缓存中查找。
  9. // 称为:第二级缓存,提前曝光的单例对象的cache,存放原始的bean对象(尚未填充属性),用于解决循环依赖
  10. singletonObject = this.earlySingletonObjects.get(beanName);
  11. // 如果允许引用的话
  12. if (singletonObject == null && allowEarlyReference) {
  13. // 同步操作
  14. synchronized (this.singletonObjects) {
  15. // Consistent creation of early reference within full singleton lock
  16. singletonObject = this.singletonObjects.get(beanName);
  17. if (singletonObject == null) {
  18. singletonObject = this.earlySingletonObjects.get(beanName);
  19. if (singletonObject == null) {
  20. // 从singletonFactories缓存中判断。称为:第三级缓存
  21. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  22. if (singletonFactory != null) {
  23. // 得到对象
  24. singletonObject = singletonFactory.getObject();
  25. // 加入二级缓存
  26. this.earlySingletonObjects.put(beanName, singletonObject);
  27. // 去掉三级缓存
  28. this.singletonFactories.remove(beanName);
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }
  35. return singletonObject;
  36. }

首先从 singletonObjects 里面获取实例,如果获取不到再从 earlySingleObjects 里面获取,如果还获取不到再从 singleFactories 里面获取对应的 ObjectFactory,然后利用其 getObject 方法来获取 bean 并放到 earlySingleObjects 里面,再从 singleFactories 中移除该 ObjectFactory .
代码执行流程图:
oj2DgpIljHuuv5Bpr5aF.svg
这里也是三级缓存解决循环依赖的处理办法,详情见:Spring 利用三级缓存解决循环依赖的方式!

getObjectForBeanInstance

接下来就会有两个大分支,一是从缓存中没有拿到对象,另一个是拿到了。
无论走哪个分支,最后都会调用 getObjectForBeanInstance 这个方法。因为我们得到 bean 的实例后要做的第一件事就是验证一下正确性✅ ,其实就是检测一下这个实例是不是 FactoryBean 类型的 bean,如果是就调用 getObject() 方法得到的返回值作为最终的 bean.

org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance

  1. protected Object getObjectForBeanInstance(
  2. Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
  3. // Don't let calling code try to dereference the factory if the bean isn't a factory.
  4. // 表明用户想要获取 factoryBean 实例
  5. if (BeanFactoryUtils.isFactoryDereference(name)) {
  6. if (beanInstance instanceof NullBean) {
  7. return beanInstance;
  8. }
  9. // 如果bean是工厂相关(名称特点:&beanName),但是 beanInstance 又不是 FactoryBean实例,异常
  10. if (!(beanInstance instanceof FactoryBean)) {
  11. throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
  12. }
  13. if (mbd != null) {
  14. mbd.isFactoryBean = true;
  15. }
  16. return beanInstance;
  17. }
  18. // Now we have the bean instance, which may be a normal bean or a FactoryBean.
  19. // If it's a FactoryBean, we use it to create a bean instance, unless the
  20. // caller actually wants a reference to the factory.
  21. if (!(beanInstance instanceof FactoryBean)) {
  22. return beanInstance;
  23. }
  24. Object object = null;
  25. if (mbd != null) {
  26. mbd.isFactoryBean = true;
  27. } else {
  28. // 尝试从缓存中获取bean
  29. object = getCachedObjectForFactoryBean(beanName);
  30. }
  31. if (object == null) {
  32. // Return bean instance from factory.
  33. FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
  34. // Caches object obtained from FactoryBean if it is a singleton.
  35. if (mbd == null && containsBeanDefinition(beanName)) {
  36. // 将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition
  37. // 如果指定BeanName是子Bean的话同时会合并父类的相关属性
  38. mbd = getMergedLocalBeanDefinition(beanName);
  39. }
  40. // 是否用户自定义的配置,而不是程序本身定义的
  41. boolean synthetic = (mbd != null && mbd.isSynthetic());
  42. object = getObjectFromFactoryBean(factory, beanName, !synthetic);
  43. }
  44. return object;
  45. }

流程:

  1. 该方法首先判断用户想要的是不是 FactoryBean ,因为 FactoryBean 的名称开头是 & 符号,并且做了些校验;
  2. 如果不是 FactoryBean 直接返回;
  3. 如果 FactoryBean 想要得到具体 bean 的话,首先尝试从缓存获取 bean;
  4. 如果缓存中没有的话,利用 FactoryBean 来创建 bean,创建就交给了 getObjectFromFactoryBean 方法。

org.springframework.beans.factory.support.FactoryBeanRegistrySupport#getObjectFromFactoryBean

  1. protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
  2. // 单例已注册的bean
  3. if (factory.isSingleton() && containsSingleton(beanName)) {
  4. synchronized (getSingletonMutex()) {
  5. Object object = this.factoryBeanObjectCache.get(beanName);
  6. if (object == null) {
  7. object = doGetObjectFromFactoryBean(factory, beanName);
  8. // Only post-process and store if not put there already during getObject() call above
  9. // (e.g. because of circular reference processing triggered by custom getBean calls)
  10. // 从缓存中判断是否已经存在了
  11. Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
  12. if (alreadyThere != null) {
  13. object = alreadyThere;
  14. }
  15. else {
  16. if (shouldPostProcess) {
  17. // 可能在循环原理中,直接返回
  18. if (isSingletonCurrentlyInCreation(beanName)) {
  19. // Temporarily return non-post-processed object, not storing it yet..
  20. return object;
  21. }
  22. // bean状态设置为创建中,加入 singletonsCurrentlyInCreation 缓存
  23. beforeSingletonCreation(beanName);
  24. try {
  25. // 执行处理器.
  26. object = postProcessObjectFromFactoryBean(object, beanName);
  27. }
  28. catch (Throwable ex) {
  29. throw new BeanCreationException(beanName,
  30. "Post-processing of FactoryBean's singleton object failed", ex);
  31. }
  32. finally {
  33. // bean 从 singletonsCurrentlyInCreation 缓存中移除
  34. afterSingletonCreation(beanName);
  35. }
  36. }
  37. if (containsSingleton(beanName)) {
  38. this.factoryBeanObjectCache.put(beanName, object);
  39. }
  40. }
  41. }
  42. return object;
  43. }
  44. }
  45. else {
  46. // 非单例的bean
  47. Object object = doGetObjectFromFactoryBean(factory, beanName);
  48. if (shouldPostProcess) {
  49. try {
  50. object = postProcessObjectFromFactoryBean(object, beanName);
  51. }
  52. catch (Throwable ex) {
  53. throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
  54. }
  55. }
  56. return object;
  57. }
  58. }

过程:

  1. 单例的从缓存中先判断,然后再调用方法 doGetObjectFromFactoryBean 创建,再执行各种处理器;
  2. 多例的直接调用方法 doGetObjectFromFactoryBean 创建,然后执行各种处理器;(以为多例的不缓存);

所以最终创建的方法是 doGetObjectFromFactoryBean
org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean

  1. private Object doGetObjectFromFactoryBean(FactoryBean<?> factory, String beanName)
  2. throws BeanCreationException {
  3. Object object;
  4. try {
  5. // 权限验证
  6. if (System.getSecurityManager() != null) {
  7. AccessControlContext acc = getAccessControlContext();
  8. try {
  9. object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>)
  10. factory::getObject, acc);
  11. }
  12. catch (PrivilegedActionException pae) {
  13. throw pae.getException();
  14. }
  15. }
  16. else {
  17. // 获取 bean
  18. object = factory.getObject();
  19. }
  20. }
  21. catch (FactoryBeanNotInitializedException ex) {
  22. throw new BeanCurrentlyInCreationException(beanName, ex.toString());
  23. }
  24. catch (Throwable ex) {
  25. throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
  26. }
  27. // Do not accept a null value for a FactoryBean that's not fully
  28. // initialized yet: Many FactoryBeans just return null then.
  29. // 不接受null,为空返回 NullBean
  30. if (object == null) {
  31. if (isSingletonCurrentlyInCreation(beanName)) {
  32. throw new BeanCurrentlyInCreationException(
  33. beanName, "FactoryBean which is currently in creation returned null from getObject");
  34. }
  35. object = new NullBean();
  36. }
  37. return object;
  38. }

过程:

  1. 首先做权限验证;
  2. 然后调用方法 getObject 创建 bean;
  3. 对于返回 null 是不允许的,包装成 NullBean。否则正常返回就行了。

    缓存有对象

    1. // 如果从缓存中拿到了实例
    2. if (sharedInstance != null && args == null) {
    3. if (logger.isTraceEnabled()) {
    4. // 判断是否是单例并且是创建中的对象。表示应该是相互引用的对象
    5. if (isSingletonCurrentlyInCreation(beanName)) {
    6. logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
    7. "' that is not fully initialized yet - a consequence of a circular reference");
    8. }
    9. else {
    10. // 创建了对象
    11. logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
    12. }
    13. }
    14. // 注册并得到创建好的对象
    15. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    16. }

    从缓存中获取到了对象后,就调用 getObjectForBeanInstance 方法获取即可。

    缓存无对象

    缓存中没有的话,就需要进行创建对象了。

    1. // 从缓存中没有拿到实例
    2. else {
    3. // Fail if we're already creating this bean instance:
    4. // We're assumably within a circular reference.
    5. // 默认单例,所以该分支目前不会走
    6. if (isPrototypeCurrentlyInCreation(beanName)) {
    7. throw new BeanCurrentlyInCreationException(beanName);
    8. }
    9. // Check if bean definition exists in this factory.
    10. // 没有设置过父BeanFactory所以该分支目前也不会走
    11. BeanFactory parentBeanFactory = getParentBeanFactory();
    12. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
    13. // Not found -> check parent.
    14. String nameToLookup = originalBeanName(name);
    15. if (parentBeanFactory instanceof AbstractBeanFactory) {
    16. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
    17. nameToLookup, requiredType, args, typeCheckOnly);
    18. }
    19. else if (args != null) {
    20. // Delegation to parent with explicit args.
    21. return (T) parentBeanFactory.getBean(nameToLookup, args);
    22. }
    23. else if (requiredType != null) {
    24. // No args -> delegate to standard getBean method.
    25. return parentBeanFactory.getBean(nameToLookup, requiredType);
    26. }
    27. else {
    28. return (T) parentBeanFactory.getBean(nameToLookup);
    29. }
    30. }
    31. // typeCheckOnly false
    32. if (!typeCheckOnly) {
    33. // 标记为已创建,并放入alreadyCreated缓冲中
    34. markBeanAsCreated(beanName);
    35. }
    36. try {
    37. // 获取bean定义
    38. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    39. // 如果是抽象类会抛出异常 BeanIsAbstractException
    40. checkMergedBeanDefinition(mbd, beanName, args);
    41. // Guarantee initialization of beans that the current bean depends on.
    42. // 保证bean配置的依赖都已经实例化了。<bean class="xxx" depends-on="xxxx">
    43. String[] dependsOn = mbd.getDependsOn();
    44. if (dependsOn != null) {
    45. // 遍历实例化依赖的bean
    46. for (String dep : dependsOn) {
    47. if (isDependent(beanName, dep)) {
    48. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    49. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
    50. }
    51. registerDependentBean(dep, beanName);
    52. try {
    53. getBean(dep);
    54. }
    55. catch (NoSuchBeanDefinitionException ex) {
    56. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    57. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
    58. }
    59. }
    60. }
    61. // Create bean instance.
    62. if (mbd.isSingleton()) {
    63. sharedInstance = getSingleton(beanName, () -> {
    64. try {
    65. return createBean(beanName, mbd, args);
    66. }
    67. catch (BeansException ex) {
    68. // Explicitly remove instance from singleton cache: It might have been put there
    69. // eagerly by the creation process, to allow for circular reference resolution.
    70. // Also remove any beans that received a temporary reference to the bean.
    71. destroySingleton(beanName);
    72. throw ex;
    73. }
    74. });
    75. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    76. }
    77. else if (mbd.isPrototype()) {
    78. // It's a prototype -> create a new instance.
    79. Object prototypeInstance = null;
    80. try {
    81. beforePrototypeCreation(beanName);
    82. prototypeInstance = createBean(beanName, mbd, args);
    83. }
    84. finally {
    85. afterPrototypeCreation(beanName);
    86. }
    87. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
    88. }
    89. else {
    90. String scopeName = mbd.getScope();
    91. if (!StringUtils.hasLength(scopeName)) {
    92. throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
    93. }
    94. Scope scope = this.scopes.get(scopeName);
    95. if (scope == null) {
    96. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
    97. }
    98. try {
    99. Object scopedInstance = scope.get(beanName, () -> {
    100. beforePrototypeCreation(beanName);
    101. try {
    102. return createBean(beanName, mbd, args);
    103. }
    104. finally {
    105. afterPrototypeCreation(beanName);
    106. }
    107. });
    108. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
    109. }
    110. catch (IllegalStateException ex) {
    111. throw new BeanCreationException(beanName,
    112. "Scope '" + scopeName + "' is not active for the current thread; consider " +
    113. "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
    114. ex);
    115. }
    116. }
    117. }
    118. catch (BeansException ex) {
    119. cleanupAfterBeanCreationFailure(beanName);
    120. throw ex;
    121. }
    122. }

缓存中没有对象,这个情况很好模拟。加载一个普通的 bean 即可,比如

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
  3. "https://www.springframework.org/dtd/spring-beans-2.0.dtd">
  4. <beans>
  5. <bean id="user" class="cn.lichenghao.entity.User">
  6. <property name="name">
  7. <value>Rod</value>
  8. </property>
  9. <property name="age">
  10. <value>31</value>
  11. </property>
  12. </bean>
  13. </beans>
  1. public class App2 {
  2. public static void main(String[] args) {
  3. // 根据配置文件加载bean
  4. ClassPathXmlApplicationContext classPathXmlApplicationContext
  5. = new ClassPathXmlApplicationContext("bean.xml");
  6. User bean = classPathXmlApplicationContext.getBean(User.class);
  7. bean.sayHello();
  8. }
  9. }

默认情况下是单例,并且也没有设置过父 BeanFactory 所以前两个小分支也不会走,直接到了下面。

  1. if (!typeCheckOnly) {
  2. // 标记为已创建
  3. markBeanAsCreated(beanName);
  4. }

来到方法。
spring-beans | org.springframework.beans.factory.support.AbstractBeanFactory#markBeanAsCreated

  1. protected void markBeanAsCreated(String beanName) {
  2. if (!this.alreadyCreated.contains(beanName)) {
  3. synchronized (this.mergedBeanDefinitions) {
  4. if (!this.alreadyCreated.contains(beanName)) {
  5. // Let the bean definition get re-merged now that we're actually creating
  6. // the bean... just in case some of its metadata changed in the meantime.
  7. clearMergedBeanDefinition(beanName);
  8. this.alreadyCreated.add(beanName);
  9. }
  10. }
  11. }
  12. }

这块代码就是利用了两了缓存,alreadyCreated,mergedBeanDefinitions 。标记📌 就进入了 alreadyCreated 缓存。
这块的代码全都是为了后面的创建bean在做准备。那么也到了处理bean的最重要的环节:createBean 。