https://zhuanlan.zhihu.com/p/83475033

一、前言

在介绍了 obtainFreshBeanFactory、invokeBeanFactoryPostProcessors、registerBeanPostProcessors 三个重要方法后,我们终于来到了最后一个重要方法:finishBeanFactoryInitialization。finishBeanFactoryInitialization 是这四个方法中最复杂也是最重要的,是整个 Spring IoC 核心中的核心。

二、概述

该方法会实例化所有剩余的非懒加载单例 bean。除了一些内部的 bean、实现了 BeanFactoryPostProcessor 接口的 bean、实现了 BeanPostProcessor 接口的 bean,其他的非懒加载单例 bean 都会在这个方法中被实例化,并且 BeanPostProcessor 的触发也是在这个方法中。

三、前置知识

不过在阅读源码之前,还是需要了解一些知识的。

  1. 什么是 FactoryBean ?
  2. FactoryBean 是如何使用的 ?

参考文章:14(1)-Spring源码refresh-BeanFactory和FactoryBean

四、正文

首先我们回到AbstractApplicationContext.refresh() 方法,找到代码:finishBeanFactoryInitialization(beanFactory),单击该行代码跳转到具体的实现。

  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  2. // Initialize conversion service for this context.
  3. // 初始化类型转换器
  4. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
  5. beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
  6. beanFactory.setConversionService(
  7. beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
  8. }
  9. // Register a default embedded value resolver if no bean post-processor
  10. // (such as a PropertyPlaceholderConfigurer bean) registered any before:
  11. // at this point, primarily for resolution in annotation attribute values.
  12. // 主要用于注释属性值的解析
  13. if (!beanFactory.hasEmbeddedValueResolver()) {
  14. beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
  15. }
  16. // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
  17. // 尽早初始化 LoadTimeWeaverAware Bean,以便尽早注册其转换器。
  18. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  19. for (String weaverAwareName : weaverAwareNames) {
  20. getBean(weaverAwareName);
  21. }
  22. // Stop using the temporary ClassLoader for type matching.
  23. // 停止使用临时的ClassLoader进行类型匹配。
  24. beanFactory.setTempClassLoader(null);
  25. // Allow for caching all bean definition metadata, not expecting further changes.
  26. // 设置 beanDefinition 元数据 不可以再修改
  27. beanFactory.freezeConfiguration();
  28. // Instantiate all remaining (non-lazy-init) singletons.
  29. // 实例化单例 bean
  30. beanFactory.preInstantiateSingletons();
  31. }

这里重点关注最后一行
beanFactory.preInstantiateSingletons();


4.1、preInstantiateSingletons

  1. @Override
  2. public void preInstantiateSingletons() throws BeansException {
  3. // 1.创建beanDefinitionNames的副本beanNames用于后续的遍历,
  4. // 以允许init等方法注册新的bean定义
  5. List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
  6. // 2.遍历beanNames,触发所有非懒加载单例bean的初始化
  7. for (String beanName : beanNames) {
  8. // 3.获取beanName对应的MergedBeanDefinition
  9. RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
  10. // 4.bd对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载
  11. if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
  12. // 5.判断beanName对应的bean是否为FactoryBean
  13. if (isFactoryBean(beanName)) {
  14. // 5.1 通过beanName获取FactoryBean实例
  15. // 通过getBean(&beanName)拿到的是FactoryBean本身;通过getBean(beanName)拿到的是FactoryBean创建的Bean实例
  16. final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
  17. // 5.2 判断这个FactoryBean是否希望急切的初始化
  18. boolean isEagerInit;
  19. if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
  20. isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
  21. @Override
  22. public Boolean run() {
  23. return ((SmartFactoryBean<?>) factory).isEagerInit();
  24. }
  25. }, getAccessControlContext());
  26. } else {
  27. isEagerInit = (factory instanceof SmartFactoryBean &&
  28. ((SmartFactoryBean<?>) factory).isEagerInit());
  29. }
  30. if (isEagerInit) {
  31. // 5.3 如果希望急切的初始化,则通过beanName获取bean实例
  32. getBean(beanName);
  33. }
  34. } else {
  35. // 6.如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例
  36. getBean(beanName);
  37. }
  38. }
  39. }
  40. // Trigger post-initialization callback for all applicable beans...
  41. // 7.遍历beanNames,触发所有SmartInitializingSingleton的后初始化回调
  42. for (String beanName : beanNames) {
  43. // 7.1 拿到beanName对应的bean实例
  44. Object singletonInstance = getSingleton(beanName);
  45. // 7.2 判断singletonInstance是否实现了SmartInitializingSingleton接口
  46. if (singletonInstance instanceof SmartInitializingSingleton) {
  47. final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
  48. // 7.3 触发SmartInitializingSingleton实现类的afterSingletonsInstantiated方法
  49. if (System.getSecurityManager() != null) {
  50. AccessController.doPrivileged(new PrivilegedAction<Object>() {
  51. @Override
  52. public Object run() {
  53. smartSingleton.afterSingletonsInstantiated();
  54. return null;
  55. }
  56. }, getAccessControlContext());
  57. } else {
  58. smartSingleton.afterSingletonsInstantiated();
  59. }
  60. }
  61. }
  62. }

MergedBeanDefinition可以参考
14(3)-Spring源码-MergeBeanDefinition源码分析

关于FactoryBean和BeanFactory的可以参考
14-Spring源码扩展-BeanFactory和FactoryBean
判断**beanName**对应的**bean****FactoryBean**的时候执行的逻辑: