【转】【Spring实战】Spring注解配置工作原理源码解析

  1. /**
  2. * Actually create the specified bean. Pre-creation processing has already happened
  3. * at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks.
  4. * <p>Differentiates between default bean instantiation, use of a
  5. * factory method, and autowiring a constructor.
  6. * @param beanName the name of the bean
  7. * @param mbd the merged bean definition for the bean
  8. * @param args explicit arguments to use for constructor or factory method invocation
  9. * @return a new instance of the bean
  10. * @throws BeanCreationException if the bean could not be created
  11. * @see #instantiateBean
  12. * @see #instantiateUsingFactoryMethod
  13. * @see #autowireConstructor
  14. */
  15. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
  16. // Instantiate the bean.
  17. BeanWrapper instanceWrapper = null;
  18. if (mbd.isSingleton()) {
  19. instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  20. }
  21. if (instanceWrapper == null) {
  22. instanceWrapper = createBeanInstance(beanName, mbd, args);
  23. }
  24. final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
  25. Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
  26. // Allow post-processors to modify the merged bean definition.
  27. synchronized (mbd.postProcessingLock) {
  28. if (!mbd.postProcessed) {
  29. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  30. mbd.postProcessed = true;
  31. }
  32. }
  33. // Eagerly cache singletons to be able to resolve circular references
  34. // even when triggered by lifecycle interfaces like BeanFactoryAware.
  35. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
  36. isSingletonCurrentlyInCreation(beanName));
  37. if (earlySingletonExposure) {
  38. if (logger.isDebugEnabled()) {
  39. logger.debug("Eagerly caching bean '" + beanName +
  40. "' to allow for resolving potential circular references");
  41. }
  42. addSingletonFactory(beanName, new ObjectFactory<Object>() {
  43. @Override
  44. public Object getObject() throws BeansException {
  45. return getEarlyBeanReference(beanName, mbd, bean);
  46. }
  47. });
  48. }
  49. // Initialize the bean instance.
  50. Object exposedObject = bean;
  51. try {
  52. populateBean(beanName, mbd, instanceWrapper);
  53. if (exposedObject != null) {
  54. exposedObject = initializeBean(beanName, exposedObject, mbd);
  55. }
  56. }
  57. catch (Throwable ex) {
  58. if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
  59. throw (BeanCreationException) ex;
  60. }
  61. else {
  62. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
  63. }
  64. }
  65. if (earlySingletonExposure) {
  66. Object earlySingletonReference = getSingleton(beanName, false);
  67. if (earlySingletonReference != null) {
  68. if (exposedObject == bean) {
  69. exposedObject = earlySingletonReference;
  70. }
  71. else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
  72. String[] dependentBeans = getDependentBeans(beanName);
  73. Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
  74. for (String dependentBean : dependentBeans) {
  75. if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
  76. actualDependentBeans.add(dependentBean);
  77. }
  78. }
  79. if (!actualDependentBeans.isEmpty()) {
  80. throw new BeanCurrentlyInCreationException(beanName,
  81. "Bean with name '" + beanName + "' has been injected into other beans [" +
  82. StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
  83. "] in its raw version as part of a circular reference, but has eventually been " +
  84. "wrapped. This means that said other beans do not use the final version of the " +
  85. "bean. This is often the result of over-eager type matching - consider using " +
  86. "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
  87. }
  88. }
  89. }
  90. }
  91. // Register bean as disposable.
  92. try {
  93. registerDisposableBeanIfNecessary(beanName, bean, mbd);
  94. }
  95. catch (BeanDefinitionValidationException ex) {
  96. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
  97. }
  98. return exposedObject;
  99. }

上述代码包含了创建bean的所有步骤,直接看下bean的初始化initializeBean