title: Spring源码-生命周期
top: false
cover: true
author: 张文军
date: 2021-06-29 13:04:41
tags:

  • Spring
  • Spring源码
    category:
  • Spring源码
  • Spring
    summary: Spring源码-生命周期

Java快速开发学习

锁清秋

Spring源码架构简单梳理

1. Spring核心:IOC和AOP

image-20210629042908089

2. Spring Bean的加载流程图解

image-20210629044605747
image-20210629044033175

Spring启动加载Bean核心方法

1. refresh()

org.springframework.context.support.AbstractApplicationContext#refresh

  1. public void refresh() throws BeansException, IllegalStateException {
  2. synchronized (this.startupShutdownMonitor) {
  3. StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
  4. // Prepare this context for refreshing.
  5. /**
  6. * 1、设置容器的启动时间
  7. * 2、设置活跃状态为true
  8. * 3、设置关闭状态为false
  9. * 4、获取Environment对象, 并加载当前系统的属性值到Environment对象中
  10. * 5、准备监听器和事件的集合对象,默认为空的集合
  11. */
  12. prepareRefresh();
  13. // Tell the subclass to refresh the internal bean factory.
  14. /**
  15. * 创建容器对象: DefaultListabLeBeanFactory
  16. * 加载xm配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
  17. * 即:创建Beanfactory->读取Bean的配置信息->解析成BeanDefinition对象,存入Map
  18. */
  19. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  20. // Prepare the bean factory for use in this context.
  21. // beanFactory 准备工作,给各种属性初始化赋值
  22. prepareBeanFactory(beanFactory);
  23. try {
  24. // Allows post-processing of the bean factory in context subclasses.
  25. // 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展 工作,但是可以查看web中的代码,是有具体实现的
  26. postProcessBeanFactory(beanFactory);
  27. StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
  28. // Invoke factory processors registered as beans in the context.
  29. // 调用BeanFactory的各种后置处理器:对BeanDefinition增强、修改、替换
  30. invokeBeanFactoryPostProcessors(beanFactory);
  31. /**---------------------为Bean的实例化和初始化做准备工作-----开始----------------------------------*/
  32. // Register bean processors that intercept bean creation.
  33. // 注册bean的后置处理器,这里只是注册功能,为Bean的初始化做准备工作,真正调用的是getBean方法
  34. registerBeanPostProcessors(beanFactory);
  35. beanPostProcess.end();
  36. // Initialize message source for this context.
  37. // 为上下文初始化message源,即不同语言的消息体,用来做国际化
  38. initMessageSource();
  39. // Initialize event multicaster for this context.
  40. // 初始化事件监听多路广播器
  41. initApplicationEventMulticaster();
  42. // Initialize other special beans in specific context subclasses.
  43. onRefresh();
  44. // Check for listener beans and register them.
  45. // 注册监听器:在所有注册的bean中查找listener bean, 注册到消息广播器中
  46. registerListeners();
  47. /**---------------------为Bean的实例化和初始化做准备工作-----结束----------------------------------*/
  48. // Instantiate all remaining (non-lazy-init) singletons.
  49. // 实例化所有剩余的(非延迟初始化)单例
  50. finishBeanFactoryInitialization(beanFactory);
  51. // Last step: publish corresponding event.
  52. finishRefresh();
  53. }
  54. catch (BeansException ex) {
  55. if (logger.isWarnEnabled()) {
  56. logger.warn("Exception encountered during context initialization - " +
  57. "cancelling refresh attempt: " + ex);
  58. }
  59. // Destroy already created singletons to avoid dangling resources.
  60. destroyBeans();
  61. // Reset 'active' flag.
  62. cancelRefresh(ex);
  63. // Propagate exception to caller.
  64. throw ex;
  65. }
  66. finally {
  67. // Reset common introspection caches in Spring's core, since we
  68. // might not ever need metadata for singleton beans anymore...
  69. resetCommonCaches();
  70. contextRefresh.end();
  71. }
  72. }
  73. }

2. preInstantiateSingletons()

org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

实例化和初始化

  1. /**
  2. * [preInstantiateSingletons 实例化和初始化所有单例对象]
  3. * @throws BeansException [description]
  4. */
  5. public void preInstantiateSingletons() throws BeansException {
  6. if (logger.isTraceEnabled()) {
  7. logger.trace("Pre-instantiating singletons in " + this);
  8. }
  9. // Iterate over a copy to allow for init methods which in turn register new bean definitions.
  10. // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
  11. // 将所有BeanDefinition的名字拷贝到一个集合中
  12. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
  13. // Trigger initialization of all non-lazy singleton beans...
  14. // 触发所有非懒加载的单例对象的实例化
  15. for (String beanName : beanNames) {
  16. /*获取合并BeanDefinition后的BeanDefinition对象*/
  17. RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
  18. if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
  19. /*判断当前Bean是否实现了FactoryBean接口*/
  20. if (isFactoryBean(beanName)) {
  21. Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
  22. if (bean instanceof FactoryBean) {
  23. /*进行类型转换*/
  24. FactoryBean<?> factory = (FactoryBean<?>) bean;
  25. boolean isEagerInit;
  26. if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
  27. isEagerInit = AccessController.doPrivileged(
  28. (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
  29. getAccessControlContext());
  30. }
  31. else {
  32. isEagerInit = (factory instanceof SmartFactoryBean &&
  33. ((SmartFactoryBean<?>) factory).isEagerInit());
  34. }
  35. /*判断是否需要立即初始化*/
  36. if (isEagerInit) {
  37. /*进行初始化*/
  38. getBean(beanName);
  39. }
  40. }
  41. }
  42. /*如果beanName对应的bean不是FactoryBean, 只是普通的bean,通过beanName获取bean实例*/
  43. /*即:当前Bean是首次进行实例化和初始化*/
  44. else {
  45. getBean(beanName);
  46. }
  47. }
  48. }
  49. // Trigger post-initialization callback for all applicable beans...
  50. for (String beanName : beanNames) {
  51. Object singletonInstance = getSingleton(beanName);
  52. if (singletonInstance instanceof SmartInitializingSingleton) {
  53. StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
  54. .tag("beanName", beanName);
  55. SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
  56. if (System.getSecurityManager() != null) {
  57. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  58. smartSingleton.afterSingletonsInstantiated();
  59. return null;
  60. }, getAccessControlContext());
  61. }
  62. else {
  63. smartSingleton.afterSingletonsInstantiated();
  64. }
  65. smartInitialize.end();
  66. }
  67. }
  68. }

3. getBean()

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

  1. /**
  2. * [doGetBean 此方法是实际获取bean的方法,也是触发依赖注入的方法]
  3. * @param name [description]
  4. * @param requiredType [description]
  5. * @param args [description]
  6. * @param typeCheckOnly [description]
  7. * @return [description]
  8. * @throws BeansException [description]
  9. */
  10. protected <T> T doGetBean(
  11. String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
  12. throws BeansException {
  13. String beanName = transformedBeanName(name);
  14. Object beanInstance;
  15. // Eagerly check singleton cache for manually registered singletons.
  16. // 检查缓存中是否已经有手动注册了该Bean
  17. Object sharedInstance = getSingleton(beanName);
  18. if (sharedInstance != null && args == null) {
  19. if (logger.isTraceEnabled()) {
  20. if (isSingletonCurrentlyInCreation(beanName)) {
  21. logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
  22. "' that is not fully initialized yet - a consequence of a circular reference");
  23. }
  24. else {
  25. logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
  26. }
  27. }
  28. beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  29. }
  30. else {
  31. // Fail if we're already creating this bean instance:
  32. // We're assumably within a circular reference.
  33. if (isPrototypeCurrentlyInCreation(beanName)) {
  34. throw new BeanCurrentlyInCreationException(beanName);
  35. }
  36. // Check if bean definition exists in this factory.
  37. // 检查当前BeanDefinition是否在当前的BeanFactory中,并且当前benaDefinition不是抽象的,即parentBeanDefinition
  38. BeanFactory parentBeanFactory = getParentBeanFactory();
  39. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  40. // Not found -> check parent.
  41. String nameToLookup = originalBeanName(name);
  42. if (parentBeanFactory instanceof AbstractBeanFactory) {
  43. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  44. nameToLookup, requiredType, args, typeCheckOnly);
  45. }
  46. else if (args != null) {
  47. // Delegation to parent with explicit args.
  48. return (T) parentBeanFactory.getBean(nameToLookup, args);
  49. }
  50. else if (requiredType != null) {
  51. // No args -> delegate to standard getBean method.
  52. return parentBeanFactory.getBean(nameToLookup, requiredType);
  53. }
  54. else {
  55. return (T) parentBeanFactory.getBean(nameToLookup);
  56. }
  57. }
  58. if (!typeCheckOnly) {
  59. markBeanAsCreated(beanName);
  60. }
  61. StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
  62. .tag("beanName", name);
  63. try {
  64. if (requiredType != null) {
  65. beanCreation.tag("beanType", requiredType::toString);
  66. }
  67. /*获取合并后的BeanDefinition*/
  68. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  69. /*检查BeanDefinition*/
  70. checkMergedBeanDefinition(mbd, beanName, args);
  71. // Guarantee initialization of beans that the current bean depends on.
  72. // 保证当前 bean 所依赖的 bean 的初始化
  73. // 即:实例化和初始化依赖对象
  74. String[] dependsOn = mbd.getDependsOn();
  75. if (dependsOn != null) {
  76. for (String dep : dependsOn) {
  77. if (isDependent(beanName, dep)) {
  78. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  79. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  80. }
  81. registerDependentBean(dep, beanName);
  82. try {
  83. /*递归调用实例化和初始化依赖Bean*/
  84. getBean(dep);
  85. }
  86. catch (NoSuchBeanDefinitionException ex) {
  87. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  88. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
  89. }
  90. }
  91. }
  92. // Create bean instance.
  93. // 创建Bean的实例
  94. // 单例
  95. if (mbd.isSingleton()) {
  96. sharedInstance = getSingleton(beanName, () -> {
  97. try {
  98. /*创建单例对象*/
  99. return createBean(beanName, mbd, args);
  100. }
  101. catch (BeansException ex) {
  102. // Explicitly remove instance from singleton cache: It might have been put there
  103. // eagerly by the creation process, to allow for circular reference resolution.
  104. // Also remove any beans that received a temporary reference to the bean.
  105. destroySingleton(beanName);
  106. throw ex;
  107. }
  108. });
  109. beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  110. }
  111. else if (mbd.isPrototype()) {
  112. // It's a prototype -> create a new instance.
  113. Object prototypeInstance = null;
  114. try {
  115. beforePrototypeCreation(beanName);
  116. prototypeInstance = createBean(beanName, mbd, args);
  117. }
  118. finally {
  119. afterPrototypeCreation(beanName);
  120. }
  121. beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  122. }
  123. else {
  124. String scopeName = mbd.getScope();
  125. if (!StringUtils.hasLength(scopeName)) {
  126. throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
  127. }
  128. Scope scope = this.scopes.get(scopeName);
  129. if (scope == null) {
  130. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  131. }
  132. try {
  133. Object scopedInstance = scope.get(beanName, () -> {
  134. beforePrototypeCreation(beanName);
  135. try {
  136. return createBean(beanName, mbd, args);
  137. }
  138. finally {
  139. afterPrototypeCreation(beanName);
  140. }
  141. });
  142. beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  143. }
  144. catch (IllegalStateException ex) {
  145. throw new ScopeNotActiveException(beanName, scopeName, ex);
  146. }
  147. }
  148. }
  149. catch (BeansException ex) {
  150. beanCreation.tag("exception", ex.getClass().toString());
  151. beanCreation.tag("message", String.valueOf(ex.getMessage()));
  152. cleanupAfterBeanCreationFailure(beanName);
  153. throw ex;
  154. }
  155. finally {
  156. beanCreation.end();
  157. }
  158. }
  159. return adaptBeanInstance(name, beanInstance, requiredType);
  160. }

4. doGetBean()

  1. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  2. ...
  3. // Eagerly check singleton cache for manually registered singletons.
  4. // 先去获取一次,如果不为null,此处就会走缓存了~~
  5. Object sharedInstance = getSingleton(beanName);
  6. ...
  7. // 如果不是只检查类型,那就标记这个Bean被创建了~~添加到缓存里 也就是所谓的 当前创建Bean池
  8. if (!typeCheckOnly) {
  9. markBeanAsCreated(beanName);
  10. }
  11. ...
  12. // Create bean instance.
  13. if (mbd.isSingleton()) {
  14. // 这个getSingleton方法不是SingletonBeanRegistry的接口方法 属于实现类DefaultSingletonBeanRegistry的一个public重载方法~~~
  15. // 它的特点是在执行singletonFactory.getObject();前后会执行beforeSingletonCreation(beanName);和afterSingletonCreation(beanName);
  16. // 也就是保证这个Bean在创建过程中,放入正在创建的缓存池里 可以看到它实际创建bean调用的是我们的createBean方法~~~~
  17. sharedInstance = getSingleton(beanName, () -> {
  18. try {
  19. return createBean(beanName, mbd, args);
  20. } catch (BeansException ex) {
  21. destroySingleton(beanName);
  22. throw ex;
  23. }
  24. });
  25. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  26. }
  27. }

5. doCreateBean():实例化和初始化

:实例化和初始化

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean()

其中最重要的执行逻辑调用了三个方法:

  1. 实例化Bean —–> createBeanInstance()
  2. 属性填充 —> populateBean()
  3. 执行初始化逻辑->执行AwareMethods和Bean后置处理器 —> initializeBean()
  1. /**
  2. * [doCreateBean 实例化和初始化]
  3. * @param beanName [description]
  4. * @param mbd [description]
  5. * @param args [description]
  6. * @return [description]
  7. * @throws BeanCreationException [description]
  8. */
  9. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {
  10. ...
  11. // 创建Bean对象,并且将对象包裹在BeanWrapper 中
  12. instanceWrapper = createBeanInstance(beanName, mbd, args);
  13. // 再从Wrapper中把Bean原始对象(非代理~~~) 这个时候这个Bean就有地址值了,就能被引用了~~~
  14. // 注意:此处是原始对象,这点非常的重要
  15. final Object bean = instanceWrapper.getWrappedInstance();
  16. ...
  17. // earlySingletonExposure 用于表示是否”提前暴露“原始对象的引用,用于解决循环依赖。
  18. // 对于单例Bean,该变量一般为 true 但可以通过属性allowCircularReferences = false来关闭循环引用
  19. // isSingletonCurrentlyInCreation(beanName) 表示当前bean必须在创建中才行
  20. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
  21. if (earlySingletonExposure) {
  22. if (logger.isTraceEnabled()) {
  23. logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
  24. }
  25. // 上面讲过调用此方法放进一个ObjectFactory,二级缓存会对应删除的
  26. // getEarlyBeanReference的作用:调用SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference()这个方法 否则啥都不做
  27. // 也就是给调用者个机会,自己去实现暴露这个bean的应用的逻辑~~~
  28. // 比如在getEarlyBeanReference()里可以实现AOP的逻辑~~~ 参考自动代理创建器AbstractAutoProxyCreator 实现了这个方法来创建代理对象
  29. // 若不需要执行AOP的逻辑,直接返回Bean
  30. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  31. }
  32. Object exposedObject = bean; //exposedObject 是最终返回的对象
  33. ...
  34. // 填充属于,解决@Autowired依赖~
  35. populateBean(beanName, mbd, instanceWrapper);
  36. // 执行初始化回调方法们~~~
  37. exposedObject = initializeBean(beanName, exposedObject, mbd);
  38. // earlySingletonExposure:如果你的bean允许被早期暴露出去 也就是说可以被循环引用 那这里就会进行检查
  39. // 此段代码非常重要
  40. if (earlySingletonExposure) {
  41. // 此时一级缓存肯定还没数据,但是呢此时候二级缓存earlySingletonObjects也没数据
  42. //注意,注意:第二参数为false 表示不会再去三级缓存里查了~~~
  43. // 此处非常巧妙的一点:::因为上面各式各样的实例化、初始化的后置处理器都执行了,如果你在上面执行了这一句
  44. // ((ConfigurableListableBeanFactory)this.beanFactory).registerSingleton(beanName, bean);
  45. // 那么此处得到的earlySingletonReference 的引用最终会是你手动放进去的Bean最终返回,完美的实现了"偷天换日" 特别适合中间件的设计
  46. // 我们知道,执行完此doCreateBean后执行addSingleton() 其实就是把自己再添加一次 **再一次强调,完美实现偷天换日**
  47. Object earlySingletonReference = getSingleton(beanName, false);
  48. if (earlySingletonReference != null) {
  49. // 这个意思是如果经过了initializeBean()后,exposedObject还是木有变,那就可以大胆放心的返回了
  50. // initializeBean会调用后置处理器,这个时候可以生成一个代理对象,那这个时候它哥俩就不会相等了 走else去判断吧
  51. if (exposedObject == bean) {
  52. exposedObject = earlySingletonReference;
  53. }
  54. // allowRawInjectionDespiteWrapping这个值默认是false
  55. // hasDependentBean:若它有依赖的bean 那就需要继续校验了~~~(若没有依赖的 就放过它~)
  56. else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
  57. // 拿到它所依赖的Bean们~~~~ 下面会遍历一个一个的去看~~
  58. String[] dependentBeans = getDependentBeans(beanName);
  59. Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
  60. // 一个个检查它所以Bean
  61. // removeSingletonIfCreatedForTypeCheckOnly这个放见下面 在AbstractBeanFactory里面
  62. // 简单的说,它如果判断到该dependentBean并没有在创建中的了的情况下,那就把它从所有缓存中移除~~~ 并且返回true
  63. // 否则(比如确实在创建中) 那就返回false 进入我们的if里面~ 表示所谓的真正依赖
  64. //(解释:就是真的需要依赖它先实例化,才能实例化自己的依赖)
  65. for (String dependentBean : dependentBeans) {
  66. if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
  67. actualDependentBeans.add(dependentBean);
  68. }
  69. }
  70. // 若存在真正依赖,那就报错(不要等到内存移除你才报错,那是非常不友好的)
  71. // 这个异常是BeanCurrentlyInCreationException,报错日志也稍微留意一下,方便定位错误~~~~
  72. if (!actualDependentBeans.isEmpty()) {
  73. throw new BeanCurrentlyInCreationException(beanName,
  74. "Bean with name '" + beanName + "' has been injected into other beans [" +
  75. StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
  76. "] in its raw version as part of a circular reference, but has eventually been " +
  77. "wrapped. This means that said other beans do not use the final version of the " +
  78. "bean. This is often the result of over-eager type matching - consider using " +
  79. "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
  80. }
  81. }
  82. }
  83. }
  84. return exposedObject;
  85. }
  86. // 虽然是remove方法 但是它的返回值也非常重要
  87. // 该方法唯一调用的地方就是循环依赖的最后检查处~~~~~
  88. protected boolean removeSingletonIfCreatedForTypeCheckOnly(String beanName) {
  89. // 如果这个bean不在创建中 比如是ForTypeCheckOnly的 那就移除掉
  90. if (!this.alreadyCreated.contains(beanName)) {
  91. removeSingleton(beanName);
  92. return true;
  93. }
  94. else {
  95. return false;
  96. }
  97. }
  98. }

6. createBeanInstance():实例化Benan

  1. /**
  2. * [createBeanInstance 实例化Benan]
  3. * @param beanName [description]
  4. * @param mbd [description]
  5. * @param args [description]
  6. * @return [description]
  7. */
  8. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
  9. // Make sure bean class is actually resolved at this point.
  10. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  11. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  12. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  13. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
  14. }
  15. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  16. if (instanceSupplier != null) {
  17. return obtainFromSupplier(instanceSupplier, beanName);
  18. }
  19. if (mbd.getFactoryMethodName() != null) {
  20. return instantiateUsingFactoryMethod(beanName, mbd, args);
  21. }
  22. // Shortcut when re-creating the same bean...
  23. boolean resolved = false;
  24. boolean autowireNecessary = false;
  25. if (args == null) {
  26. synchronized (mbd.constructorArgumentLock) {
  27. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  28. resolved = true;
  29. autowireNecessary = mbd.constructorArgumentsResolved;
  30. }
  31. }
  32. }
  33. if (resolved) {
  34. if (autowireNecessary) {
  35. return autowireConstructor(beanName, mbd, null, null);
  36. }
  37. else {
  38. return instantiateBean(beanName, mbd);
  39. }
  40. }
  41. // Candidate constructors for autowiring?
  42. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  43. if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
  44. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  45. return autowireConstructor(beanName, mbd, ctors, args);
  46. }
  47. // Preferred constructors for default construction?
  48. ctors = mbd.getPreferredConstructors();
  49. if (ctors != null) {
  50. return autowireConstructor(beanName, mbd, ctors, null);
  51. }
  52. // No special handling: simply use no-arg constructor.
  53. return instantiateBean(beanName, mbd);
  54. }

7. populateBean():属性填充

: 属性填充(不会执行Aware方法)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean()

  1. protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
  2. if (bw == null) {
  3. if (mbd.hasPropertyValues()) {
  4. throw new BeanCreationException(
  5. mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
  6. }
  7. else {
  8. // Skip property population phase for null instance.
  9. return;
  10. }
  11. }
  12. // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
  13. // state of the bean before properties are set. This can be used, for example,
  14. // to support styles of field injection.
  15. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  16. for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
  17. if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
  18. return;
  19. }
  20. }
  21. }
  22. PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
  23. int resolvedAutowireMode = mbd.getResolvedAutowireMode();
  24. if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
  25. MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
  26. // Add property values based on autowire by name if applicable.
  27. if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
  28. autowireByName(beanName, mbd, bw, newPvs);
  29. }
  30. // Add property values based on autowire by type if applicable.
  31. if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
  32. autowireByType(beanName, mbd, bw, newPvs);
  33. }
  34. pvs = newPvs;
  35. }
  36. boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
  37. boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
  38. PropertyDescriptor[] filteredPds = null;
  39. if (hasInstAwareBpps) {
  40. if (pvs == null) {
  41. pvs = mbd.getPropertyValues();
  42. }
  43. for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
  44. PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
  45. if (pvsToUse == null) {
  46. if (filteredPds == null) {
  47. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
  48. }
  49. pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
  50. if (pvsToUse == null) {
  51. return;
  52. }
  53. }
  54. pvs = pvsToUse;
  55. }
  56. }
  57. if (needsDepCheck) {
  58. if (filteredPds == null) {
  59. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
  60. }
  61. checkDependencies(beanName, mbd, filteredPds, pvs);
  62. }
  63. if (pvs != null) {
  64. /**
  65. *属性填充
  66. */
  67. applyPropertyValues(beanName, mbd, bw, pvs);
  68. }
  69. }

8 . initializeBean()

:执行初始化逻辑->执行AwareMethods和Bean后置处理器

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean()

  1. protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
  2. if (System.getSecurityManager() != null) {
  3. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  4. invokeAwareMethods(beanName, bean);
  5. return null;
  6. }, getAccessControlContext());
  7. }
  8. else {
  9. //执行Aware方法,给相应属性赋值
  10. invokeAwareMethods(beanName, bean);
  11. }
  12. Object wrappedBean = bean;
  13. if (mbd == null || !mbd.isSynthetic()) {
  14. // 执行Bean的处理器前置方法
  15. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  16. }
  17. try {
  18. //执行用户自定义的 init-method方法
  19. invokeInitMethods(beanName, wrappedBean, mbd);
  20. }
  21. catch (Throwable ex) {
  22. throw new BeanCreationException(
  23. (mbd != null ? mbd.getResourceDescription() : null),
  24. beanName, "Invocation of init method failed", ex);
  25. }
  26. if (mbd == null || !mbd.isSynthetic()) {
  27. // 执行Bean的处理器后置方法
  28. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  29. }
  30. return wrappedBean;
  31. }

Spring循环依赖

1. Spring循环依赖概述

在一个对象依赖关系中,A对象依赖B对象,B对象依赖A对象;造成循环依赖链

image-20210630165136629

2. 简单模仿解决循环引用:

  1. package cn.zhanghub.spring.circularDependency.circularDependency;
  2. import lombok.Getter;
  3. import lombok.SneakyThrows;
  4. import java.lang.reflect.Field;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * 类描述:
  9. *
  10. * @ClassName Imitate
  11. * @Author 张文军
  12. * @Date 2021/7/1 0:00
  13. * @Version 1.0
  14. */
  15. public class Imitate {
  16. /**
  17. * 放置创建好的bean Map,模拟单例池
  18. */
  19. private static Map<String, Object> cacheMap = new HashMap<>(2);
  20. public static void main(String[] args) {
  21. // 假装扫描出来的对象
  22. Class[] classes = {A.class, B.class};
  23. // 假装项目初始化实例化所有bean
  24. for (Class aClass : classes) {
  25. getBean(aClass);
  26. }
  27. // check
  28. System.out.println(getBean(B.class).getA() == getBean(A.class));
  29. System.out.println(getBean(A.class).getB() == getBean(B.class));
  30. }
  31. @SneakyThrows
  32. private static <T> T getBean(Class<T> beanClass) {
  33. // 类名小写简单代替bean的命名规则
  34. String beanName = beanClass.getSimpleName().toLowerCase();
  35. // 如果已经是一个bean,则直接返回
  36. if (cacheMap.containsKey(beanName)) {
  37. return (T) cacheMap.get(beanName);
  38. }
  39. // 将对象本身实例化
  40. Object object = beanClass.getDeclaredConstructor().newInstance();
  41. // 放入缓存
  42. cacheMap.put(beanName, object);
  43. // 把所有字段当成需要注入的bean,创建并注入到当前bean中
  44. Field[] fields = object.getClass().getDeclaredFields();
  45. for (Field field : fields) {
  46. field.setAccessible(true);
  47. // 获取需要注入字段的class
  48. Class<?> fieldClass = field.getType();
  49. String fieldBeanName = fieldClass.getSimpleName().toLowerCase();
  50. // 如果需要注入的bean,已经在缓存Map中,那么把缓存Map中的值注入到该field即可
  51. // 如果缓存没有 继续创建
  52. field.set(object, cacheMap.containsKey(fieldBeanName) ? cacheMap.get(fieldBeanName) : getBean(fieldClass));
  53. }
  54. // 属性填充完成,返回
  55. return (T) object;
  56. }
  57. }
  58. class B {
  59. @Getter
  60. private A a;
  61. }
  62. class A {
  63. @Getter
  64. private B b;
  65. }

3. Spring三级缓存

image-20210701012914069

  1. /** Cache of singleton objects: bean name to bean instance. */
  2. // 从上至下 分表代表这“三级缓存”
  3. // 1、一级缓存放完整Bean对象
  4. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //一级缓存
  5. // 2、二级缓存放Bean的早期暴露对象,即未完成初始化赋值的实例
  6. private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 二级缓存
  7. // 3、放lambda表达式,来完成代理对象的覆盖过程-->即:存放Bean的原始工厂
  8. private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 三级缓存
  9. ...
  10. /** Names of beans that are currently in creation. */
  11. // 这个缓存也十分重要:它表示bean创建过程中都会在里面呆着~
  12. // 它在Bean开始创建时放值,创建完成时会将其移出~
  13. private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16));
  14. /** Names of beans that have already been created at least once. */
  15. // 当这个Bean被创建完成后,会标记为这个 注意:这里是set集合 不会重复
  16. // 至少被创建了一次的 都会放进这里~~~~
  17. private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));

1. getBean()方法中三级缓存

  1. @Nullable
  2. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  3. Object singletonObject = this.singletonObjects.get(beanName);
  4. // 这个bean 正处于 创建阶段
  5. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  6. // 并发控制
  7. synchronized (this.singletonObjects) {
  8. // 单例缓存是否存在
  9. singletonObject = this.earlySingletonObjects.get(beanName);
  10. // 是否运行获取 bean factory 创建出的 bean
  11. if (singletonObject == null && allowEarlyReference) {
  12. // 获取缓存中的 ObjectFactory
  13. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  14. if (singletonFactory != null) {
  15. singletonObject = singletonFactory.getObject();
  16. // 将对象缓存到 earlySingletonObject中
  17. this.earlySingletonObjects.put(beanName, singletonObject);
  18. // 从工厂缓冲中移除
  19. this.singletonFactories.remove(beanName);
  20. }
  21. }
  22. }
  23. }
  24. return singletonObject;
  1. 先从一级缓存singletonObjects中去获取。(如果获取到就直接return)
  2. 如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。(如果获取到就直接return)
  3. 如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从三级缓存singletonFactory.getObject()获取。(如果获取到了就从singletonFactories中移除,并且放进earlySingletonObjects。其实也就是从三级缓存移动(是剪切、不是复制哦~)到了二级缓存)

加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决

缓存添加过程

单例模式下,第一次获取Bean时由于Bean示例还未实例化,因此会先创建Bean然后放入缓存中,以后再次调用获取Bean方法将直接从缓存中获取,不再重新创建。Spring中,获取Bean的流程:
image-20210701023710256
对Bean的创建最为核心三个方法解释如下:

  • createBeanInstance:例化,其实也就是调用对象的构造方法实例化对象
  • populateBean:填充属性,这一步主要是对bean的依赖属性进行注入(@Autowired)
  • initializeBean:回到一些形如initMethodInitializingBean等方法

从对单例Bean的初始化可以看出,循环依赖主要发生在第二步(populateBean),也就是field属性注入的处理。
image-20210701181234130
缓存添加过程主要发生在创建Bean也就是doCreateBean()过程中。doCreateBean()中在实例化完后,属性填充前, 有这样一句代码
即:添加三级缓存:存放Bean 的原始工厂 ObjectFactory: 将创建对象的步骤封装到ObjectFactory中 交给自定义的Scope来选择是否需要创建对象来灵活的实现scope。

  1. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

getEarlyBeanReference():获取早期暴露对象—>对对象进行AOP代理
即:保证自己被循环依赖的时候,即使被别的Bean @Autowire进去的也是代理对象~~~~ AOP自动代理创建器此方法里会创建的代理对象

  1. protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
  2. Object exposedObject = bean;
  3. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  4. for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
  5. exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
  6. }
  7. }
  8. return exposedObject;
  9. }

其添加三级缓存源码如下:

  1. protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
  2. Assert.notNull(singletonFactory, "Singleton factory must not be null");
  3. synchronized (this.singletonObjects) {
  4. if (!this.singletonObjects.containsKey(beanName)) {
  5. this.singletonFactories.put(beanName, singletonFactory);
  6. this.earlySingletonObjects.remove(beanName);
  7. this.registeredSingletons.add(beanName);
  8. }
  9. }
  10. }

2. 三级缓存作用

第一级缓存存的是对外暴露的对象,也就是我们应用需要用到的
第二级缓存的作用是为了处理循环依赖的对象创建问题,里面存的是半成品对象或半成品对象的代理对象
第三级缓存的作用处理存在 AOP + 循环依赖的对象创建问题,能将代理对象提前创建

3. Spring 为什么要引入第三级缓存

严格来讲,第三级缓存并非缺它不可,因为可以提前创建代理对象
提前创建代理对象只是会节省那么一丢丢内存空间,并不会带来性能上的提升,但是会破环 Spring 的设计原则
Spring 的设计原则是尽可能保证普通对象创建完成之后,再生成其 AOP 代理(尽可能延迟代理对象的生成)
所以 Spring 用了第三级缓存,既维持了设计原则,又处理了循环依赖;牺牲那么一丢丢内存空间是愿意接受的

4. Spring 循环引用创建过程

image-20210701150204090
依旧以上面AB类使用属性field注入循环依赖的例子为例,对整个流程做文字步骤总结如下:

  1. 使用context.getBean(A.class),旨在获取容器内的单例A(若A不存在,就会走A这个Bean的创建流程),显然初次获取A是不存在的,因此走A的创建之路~
  2. 实例化A(注意此处仅仅是实例化),并将它放进缓存(此时A已经实例化完成,已经可以被引用了)实例化A:-> 放入三级缓存
  3. 初始化A:@Autowired依赖注入B(此时需要去容器内获取B)
  4. 为了完成依赖注入B,会通过getBean(B)去容器内找B。但此时B在容器内不存在,就走向B的创建之路~
  5. 实例化B,并将其放入缓存。(此时B也能够被引用了)实例化B:-> 放入三级缓存
  6. 初始化B,@Autowired依赖注入A(此时需要去容器内获取A)三级缓存删除A:放入二级缓存
  7. 此处重要:初始化B时会调用getBean(A)去容器内找到A,上面我们已经说过了此时候因为A已经实例化完成了并且放进了缓存里,所以这个时候去看缓存里是已经存在A的引用了的,所以getBean(A)能够正常返回
  8. B初始化成功(此时已经注入A成功了,已成功持有A的引用了),return(注意此处return相当于是返回最上面的getBean(B)这句代码,回到了初始化A的流程中~)。
  9. 因为B实例已经成功返回了,因此最终A也初始化成功

    5. bean的生命流程

    image-20210701180844101