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

1 AbstractBeanFactory.getBean 主流程

  1. @Override
  2. public Object getBean(String name) throws BeansException {
  3. return doGetBean(name, null, null, false);
  4. }

第二个参数表示bean的Class类型,第三个表示创建bean需要的参数,最后一个表示不需要进行类型检查。

  1. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
  2. @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  3. //1 提取beanName
  4. //去除&符号,因为当配置文件中<bean>的class属性配置的实现类是FactoryBean时
  5. //通过getBean()方法返回的不是FactoryBean本身,
  6. //而是FactoryBean#getObject()方法所返回的对象
  7. //相当于FactoryBean#getObject()代理了getBean()方法
  8. //如果希望获取FactoryBean的实例,需要在beanName前加上“&”符号,即getBean("&beanName")
  9. //在这里要获取的是bean的实例,所以要去掉&符号
  10. final String beanName = transformedBeanName(name);
  11. Object bean;
  12. // Eagerly check singleton cache for manually registered singletons.
  13. //2 率先直接从单例缓存或objectFactory中提取bean,容器内部初始化和非初始化(手动调用)过程也都被调用
  14. //如果是原型bean,直接获得不到,进入创建bean的else流程
  15. Object sharedInstance = getSingleton(beanName);
  16. // 3 getbean 主流程
  17. // 3.1 如果存在该单例bean且属性为空,直接返回
  18. if (sharedInstance != null && args == null) {
  19. if (logger.isTraceEnabled()) {
  20. // 3.1.1循环依赖
  21. if (isSingletonCurrentlyInCreation(beanName)) {
  22. logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
  23. "' that is not fully initialized yet - a consequence of a circular reference");
  24. }
  25. // 3.1.2不存在循环依赖
  26. else {
  27. logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
  28. }
  29. }
  30. // 3.1.3 getObjectForBeanInstance
  31. //如果从缓存中得到了bean的原始状态,则需要对bean进行实例化。
  32. //缓存中记录的只是最原始的bean状态,并不一定是我们最终想要的bean。
  33. //假如我们需要对工厂bean进行处理,那么这里得到的其实是工厂bean的初始状态
  34. //但是我们正真需要的是工程bean中定义的factory-method方法中返回的bean
  35. //而getObjectForBeanInstance就是完成这个工作的
  36. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  37. }
  38. // 3.2 非单例,或者单例第一次创建,或单例已存在参数不为空
  39. else {
  40. // Fail if we're already creating this bean instance:
  41. // We're assumably within a circular reference.
  42. // 3.2.1 检查循环依赖是否合法
  43. //只有单例才会解决bean的循环依赖问题
  44. //原型bean 依赖的存在bean正在创建 非法
  45. if (isPrototypeCurrentlyInCreation(beanName)) {
  46. throw new BeanCurrentlyInCreationException(beanName);
  47. }
  48. // Check if bean definition exists in this factory.
  49. // 3.2.2 beanName不在本容器内,检查父容器,委托给父工厂中寻找,甚至创建
  50. BeanFactory parentBeanFactory = getParentBeanFactory();
  51. //如果当前bean不在当前beanfactory的beanDefinitionMap,委托给父工厂中寻找,甚至创建
  52. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  53. // Not found -> check parent.
  54. String nameToLookup = originalBeanName(name);
  55. if (parentBeanFactory instanceof AbstractBeanFactory) {
  56. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  57. nameToLookup, requiredType, args, typeCheckOnly);
  58. }
  59. else if (args != null) {
  60. // Delegation to parent with explicit args.
  61. return (T) parentBeanFactory.getBean(nameToLookup, args);
  62. }
  63. else if (requiredType != null) {
  64. // No args -> delegate to standard getBean method.
  65. return parentBeanFactory.getBean(nameToLookup, requiredType);
  66. }
  67. else {
  68. return (T) parentBeanFactory.getBean(nameToLookup);
  69. }
  70. }
  71. //3.2.3标记已经该bean创建了
  72. // 清除合并父beanDefiniton的标志,把创建的beanName加入
  73. if (!typeCheckOnly) {
  74. markBeanAsCreated(beanName);
  75. }
  76. // 3.2.4 合并父beanDefiniton和递归get依赖的bean
  77. try {
  78. //读取bean的标签对应的BeanDefinition,子bean的话合并父属性
  79. final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  80. checkMergedBeanDefinition(mbd, beanName, args);
  81. // Guarantee initialization of beans that the current bean depends on.
  82. String[] dependsOn = mbd.getDependsOn();
  83. if (dependsOn != null) {
  84. for (String dep : dependsOn) {
  85. if (isDependent(beanName, dep)) {
  86. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  87. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  88. }
  89. //注册依赖和递归获得bean的顺序与3.0版本相反
  90. //注册依赖关系
  91. registerDependentBean(dep, beanName);
  92. try {
  93. //递归调用 get依赖的bean
  94. getBean(dep);
  95. }
  96. catch (NoSuchBeanDefinitionException ex) {
  97. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  98. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
  99. }
  100. }
  101. }
  102. // Create bean instance.
  103. // 3.2.5 创建bean
  104. //3.2.5 .1 单例bean
  105. if (mbd.isSingleton()) {
  106. sharedInstance = getSingleton(beanName, () -> {
  107. try {
  108. return createBean(beanName, mbd, args);
  109. }
  110. catch (BeansException ex) {
  111. // Explicitly remove instance from singleton cache: It might have been put there
  112. // eagerly by the creation process, to allow for circular reference resolution.
  113. // Also remove any beans that received a temporary reference to the bean.
  114. destroySingleton(beanName);
  115. throw ex;
  116. }
  117. });
  118. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  119. }
  120. //3.2.5 .2 原型bean
  121. else if (mbd.isPrototype()) {
  122. // It's a prototype -> create a new instance.
  123. Object prototypeInstance = null;
  124. try {
  125. beforePrototypeCreation(beanName);
  126. prototypeInstance = createBean(beanName, mbd, args);
  127. }
  128. finally {
  129. afterPrototypeCreation(beanName);
  130. }
  131. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  132. }
  133. //3.2.5 .3 其他scope的bean
  134. else {
  135. String scopeName = mbd.getScope();
  136. final Scope scope = this.scopes.get(scopeName);
  137. if (scope == null) {
  138. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  139. }
  140. try {
  141. Object scopedInstance = scope.get(beanName, () -> {
  142. beforePrototypeCreation(beanName);
  143. try {
  144. return createBean(beanName, mbd, args);
  145. }
  146. finally {
  147. afterPrototypeCreation(beanName);
  148. }
  149. });
  150. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  151. }
  152. catch (IllegalStateException ex) {
  153. throw new BeanCreationException(beanName,
  154. "Scope '" + scopeName + "' is not active for the current thread; consider " +
  155. "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
  156. ex);
  157. }
  158. }
  159. }
  160. catch (BeansException ex) {
  161. cleanupAfterBeanCreationFailure(beanName);
  162. throw ex;
  163. }
  164. }
  165. // Check if required type matches the type of the actual bean instance.
  166. //4 转换bean为需要的类型,不满足抛出异常
  167. if (requiredType != null && !requiredType.isInstance(bean)) {
  168. try {
  169. T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
  170. if (convertedBean == null) {
  171. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  172. }
  173. return convertedBean;
  174. }
  175. catch (TypeMismatchException ex) {
  176. if (logger.isTraceEnabled()) {
  177. logger.trace("Failed to convert bean '" + name + "' to required type '" +
  178. ClassUtils.getQualifiedName(requiredType) + "'", ex);
  179. }
  180. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  181. }
  182. }
  183. return (T) bean;
  184. }

2 两个 getSingleton方法

2.1 从一级缓存获得bean(解决循环依赖第一步)

  1. //先从singletonObjects寻找,如果找不到,再从earlySingletonObjects寻找,
  2. //仍然找不到,那就从singletonFactories寻找对应的制造singleton的工厂,
  3. //然后调用工厂的getObject方法,造出对应的SingletonBean,并放入earlySingletonObjects中
  1. //单例Bean的缓存,一级缓存 bean name 对应 bean 实例
  2. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
  3. /** Cache of singleton factories: bean name to ObjectFactory. */
  4. //ObjectFactory的缓存,bean name 对应 特定ObjectFactory;
  5. //ObjectFactory的getObject方法返回bean的实例 ObjectFactory通过getObject方法获取到了earlySingletonBean
  6. //然后在由earlySingletonBean成为bean的实例
  7. // 有人叫二级缓存
  8. private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
  9. /** Cache of early singleton objects: bean name to bean instance. */
  10. //早期bean实例的缓存,beanName对应 early bean instance
  11. //是singletonFactory 制造出来的 singleton的缓存 有人叫三级缓存
  12. private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
  13. @Nullable
  14. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  15. Object singletonObject = this.singletonObjects.get(beanName);
  16. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  17. synchronized (this.singletonObjects) {
  18. singletonObject = this.earlySingletonObjects.get(beanName);
  19. if (singletonObject == null && allowEarlyReference) {
  20. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  21. if (singletonFactory != null) {
  22. singletonObject = singletonFactory.getObject();
  23. this.earlySingletonObjects.put(beanName, singletonObject);
  24. this.singletonFactories.remove(beanName);
  25. }
  26. }
  27. }
  28. }
  29. return singletonObject;
  30. }

2.2 create新的bean与几个缓存交互

  1. public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
  2. Assert.notNull(beanName, "Bean name must not be null");
  3. synchronized (this.singletonObjects) {
  4. Object singletonObject = this.singletonObjects.get(beanName);
  5. //1 从缓存拿,拿不到创建
  6. if (singletonObject == null) {
  7. if (this.singletonsCurrentlyInDestruction) {
  8. throw new BeanCreationNotAllowedException(beanName,
  9. "Singleton bean creation not allowed while singletons of this factory are in destruction " +
  10. "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
  11. }
  12. if (logger.isDebugEnabled()) {
  13. logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
  14. }
  15. //2 创建bean前置检查,如已经存在正在创建的bean且inCreationCheckExclusions(web容器中)中不存在该bean,则抛出异常
  16. beforeSingletonCreation(beanName);
  17. boolean newSingleton = false;
  18. boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
  19. if (recordSuppressedExceptions) {
  20. this.suppressedExceptions = new LinkedHashSet<>();
  21. }
  22. //3 利用ObjectFactory创建新的单例bean
  23. try {
  24. singletonObject = singletonFactory.getObject();
  25. newSingleton = true;
  26. }
  27. catch (IllegalStateException ex) {
  28. // Has the singleton object implicitly appeared in the meantime ->
  29. // if yes, proceed with it since the exception indicates that state.
  30. singletonObject = this.singletonObjects.get(beanName);
  31. if (singletonObject == null) {
  32. throw ex;
  33. }
  34. }
  35. catch (BeanCreationException ex) {
  36. if (recordSuppressedExceptions) {
  37. for (Exception suppressedException : this.suppressedExceptions) {
  38. ex.addRelatedCause(suppressedException);
  39. }
  40. }
  41. throw ex;
  42. }
  43. finally {
  44. if (recordSuppressedExceptions) {
  45. this.suppressedExceptions = null;
  46. }
  47. //4 创建bean前置检查,如移除正在创建的bean失败且inCreationCheckExclusions(web容器中)中不存在该bean,则抛出异常
  48. afterSingletonCreation(beanName);
  49. }
  50. //5 成功的创建了新的bean则加入缓存
  51. if (newSingleton) {
  52. addSingleton(beanName, singletonObject);
  53. }
  54. }
  55. return singletonObject;
  56. }
  57. }

3 createBean

源码位于AbstractAutowireCapableBeanFactory.createBean

  1. protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
  2. throws BeanCreationException {
  3. if (logger.isTraceEnabled()) {
  4. logger.trace("Creating instance of bean '" + beanName + "'");
  5. }
  6. RootBeanDefinition mbdToUse = mbd;
  7. // Make sure bean class is actually resolved at this point, and
  8. // clone the bean definition in case of a dynamically resolved Class
  9. // which cannot be stored in the shared merged bean definition.
  10. //1 获得bean的class对象,根据beanName或beandefiniton属性解析class
  11. // 克隆那些因动态解析类的情况下,不能存储在共享合并bean定义的beandefinition,动态支持
  12. Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
  13. if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
  14. mbdToUse = new RootBeanDefinition(mbd);
  15. mbdToUse.setBeanClass(resolvedClass);
  16. }
  17. // Prepare method overrides.
  18. //2 lookup-overrides 和 replace-overrides处理 检查方法覆盖是否合法
  19. try {
  20. mbdToUse.prepareMethodOverrides();
  21. }
  22. catch (BeanDefinitionValidationException ex) {
  23. throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
  24. beanName, "Validation of method overrides failed", ex);
  25. }
  26. try {
  27. // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
  28. //3 给 InstantiationAwareBeanPostProcessor一个机会 返回代理单例对象代替当前对象
  29. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  30. //为特殊的bean提够短路功能,如aop
  31. if (bean != null) {
  32. return bean;
  33. }
  34. }
  35. catch (Throwable ex) {
  36. throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
  37. "BeanPostProcessor before instantiation of bean failed", ex);
  38. }
  39. try {
  40. // 4 具体创建bean
  41. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
  42. if (logger.isTraceEnabled()) {
  43. logger.trace("Finished creating instance of bean '" + beanName + "'");
  44. }
  45. return beanInstance;
  46. }
  47. catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
  48. // A previously detected exception with proper bean creation context already,
  49. // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
  50. throw ex;
  51. }
  52. catch (Throwable ex) {
  53. throw new BeanCreationException(
  54. mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
  55. }
  56. }

3.1 InstantiationAwareBeanPostProcessor

给 InstantiationAwareBeanPostProcessor一个机会 返回代理单例对象代替当前对象
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
//为特殊的bean提够短路功能,如aop
if (bean != null) {
return bean;
}

  1. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  2. Object bean = null;
  3. //未被初始化
  4. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  5. // Make sure bean class is actually resolved at this point.
  6. // Synthetic特殊的bean,临时的bean。spring自己的bean
  7. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  8. Class<?> targetType = determineTargetType(beanName, mbd);
  9. if (targetType != null) {
  10. // 核心逻辑
  11. // 1 创建实例的前置处理
  12. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
  13. // 2 创建实例的后置处理
  14. if (bean != null) {
  15. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
  16. }
  17. }
  18. }
  19. mbd.beforeInstantiationResolved = (bean != null);
  20. }
  21. return bean;
  22. }

3.2 doCreateBean

4 bean对象后置处理器:BeanPostProcessor

Bean后置处理器:负责对已创建好的bean对象进行加工处理。

主要是可以对新创建的bean实例进行修改,提供了一个类似于hook机制,对创建好的bean对象实例进行修改。 另外,不要将BeanPostProcessor标记为延迟初始化。因为如果这样做,Spring容器将不会注册它们,自定义逻辑也就无法得到应用。假如你在元素的定义中使用了’default-lazy-init’属性,请确信你的各个BeanPostProcessor标记为’lazy-init=”false”‘。

  1. public interface BeanPostProcessor {
  2. //bean初始化方法调用前被调用 在创建好bean实例,但是在任何初始化回调执行之前,如InitializingBean的afterPropertiesSet,先执行该方法。
  3. Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
  4. //bean初始化方法调用后被调用 在创建好bean实例,并且所有的初始化回调都执行完了,如InitializingBean的afterPropertiesSet,再执行该方法
  5. Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
  6. }
  7. public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
  8. @Nullable
  9. default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  10. return null;
  11. }
  12. default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
  13. return true;
  14. }
  15. @Nullable
  16. default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
  17. throws BeansException {
  18. return null;
  19. }
  20. @Deprecated
  21. @Nullable
  22. default PropertyValues postProcessPropertyValues(
  23. PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
  24. return pvs;
  25. }
  26. }

ApplicationContext会自动检测当前存在的beanPostProcessors,并应用在创建的bean实例上。

注解处理相关的BeanPostProcessor
通常用于在创建好bean对象实例后,处理这个bean上面的注解。同时也可以对bean对象进行其他功能拓展。
BeanPostProcessor的注册
定义:在注解配置工具类AnnotationConfigUtils的静态方法registerAnnotationConfigProcessors方法中,定义注解的处理器的注册逻辑。
调用:在BeanFactoryPostProcessor中调用这个静态方法来完成将特定的BeanPostProcessor实现类,注册到ApplicationContext的BeanPostProcessor列表:
1 AutowiredAnnotationBeanPostProcessor:处理bean对象的依赖注入关系,即从BeanFactory获取该bean所依赖的bean,然后注入到该bean对应的成员变量中。

2 CommonAnnotationBeanPostProcessor:该bean中所使用了的JDK定义的注解的处理,如方法中的@PostConstruct,@PreDestroy,成员变量上的@Resource等。

3 PersistenceAnnotationBeanPostProcessor(JPA时添加):JPA相关bean的持久化处理。