【Spring】DI:源码流程(上)实例化Bean

Dear 丶 2022-10-31 01:47 301阅读 0赞

当SpringIOC 容器完成了Bean定义资源的定位、载入和解析注册以后,IOC 容器中已经管理了Bean定义的相关数据,但是此时 IOC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:

  1. 用户第一次调用 getBean() 方法时,IOC 容器触发依赖注入
  2. 当用户在配置文件中将元素配置了lazy-init=false属性,即让容器在解析注册 Bean 定义时进行预实例化,触发依赖注入

DI 大致可以两步:实例化Bean => 依赖注入

20201209005143410.png

1.寻找获取Bean的入口 (AbstractBeanFactory)

getBean()

实现了BeanFactory的getBean()方法

  1. // 获取IOC容器中指定名称的Bean
  2. @Override
  3. public Object getBean(String name) throws BeansException {
  4. // doGetBean才是真正向IoC容器获取被管理Bean的过程
  5. return doGetBean(name, null, null, false);
  6. }
  7. // 获取IOC容器中指定名称和类型的Bean
  8. @Override
  9. public <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException {
  10. // doGetBean才是真正向IoC容器获取被管理Bean的过程
  11. return doGetBean(name, requiredType, null, false);
  12. }
  13. // 获取IOC容器中指定名称和参数的Bean
  14. @Override
  15. public Object getBean(String name, Object... args) throws BeansException {
  16. // doGetBean才是真正向IoC容器获取被管理Bean的过程
  17. return doGetBean(name, null, args, false);
  18. }

doGetBean()

  1. @SuppressWarnings("unchecked")
  2. // 真正实现向IOC容器获取Bean的功能,也是触发依赖注入功能的地方
  3. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
  4. @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  5. // 根据指定的名称获取被管理Bean的名称,剥离指定名称中对容器的相关依赖
  6. // 如果指定的是别名,将别名转换为规范的Bean名称
  7. final String beanName = transformedBeanName(name);
  8. Object bean;
  9. // Eagerly check singleton cache for manually registered singletons.
  10. // 先从缓存中取是否已经有被创建过的单态类型的Bean
  11. // 对于单例模式的Bean整个IOC容器中只创建一次,不需要重复创建
  12. Object sharedInstance = getSingleton(beanName);
  13. // IOC容器创建单例模式Bean实例对象
  14. if (sharedInstance != null && args == null) {
  15. if (logger.isDebugEnabled()) {
  16. // 如果指定名称的Bean在容器中已有单例模式的Bean被创建直接返回已经创建的Bean
  17. if (isSingletonCurrentlyInCreation(beanName)) {
  18. logger.debug("Returning eagerly cached instance of singleton bean '" + beanName
  19. + "' that is not fully initialized yet - a consequence of a circular reference");
  20. }
  21. else {
  22. logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
  23. }
  24. }
  25. // 获取给定Bean的实例对象,主要是完成FactoryBean的相关处理
  26. // 注意:BeanFactory是管理容器中Bean的工厂,而FactoryBean是创建创建对象的工厂Bean,两者之间有区别
  27. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  28. }
  29. else {
  30. // Fail if we're already creating this bean instance:
  31. // We're assumably within a circular reference.
  32. // 缓存没有正在创建的单例模式Bean
  33. // 缓存中已经有已经创建的原型模式Bean,但是由于循环引用的问题导致实例化对象失败
  34. if (isPrototypeCurrentlyInCreation(beanName)) {
  35. throw new BeanCurrentlyInCreationException(beanName);
  36. }
  37. // Check if bean definition exists in this factory.
  38. // 对IOC容器中是否存在指定名称的BeanDefinition进行检查
  39. // 首先检查是否能在当前的BeanFactory中获取的所需要的Bean,如果不能则委托当前容器的父级容器去查找
  40. // 如果还是找不到则沿着容器的继承体系向父级容器查找
  41. BeanFactory parentBeanFactory = getParentBeanFactory();
  42. // 当前容器的父级容器存在,且当前容器中不存在指定名称的Bean
  43. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  44. // Not found -> check parent.
  45. // 解析指定Bean名称的原始名称
  46. String nameToLookup = originalBeanName(name);
  47. if (parentBeanFactory instanceof AbstractBeanFactory) {
  48. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  49. nameToLookup, requiredType, args, typeCheckOnly);
  50. }
  51. else if (args != null) {
  52. // Delegation to parent with explicit args.
  53. // 委派父级容器根据指定名称和显式的参数查找
  54. return (T) parentBeanFactory.getBean(nameToLookup, args);
  55. }
  56. else {
  57. // No args -> delegate to standard getBean method.
  58. // 委派父级容器根据指定名称和类型查找
  59. return parentBeanFactory.getBean(nameToLookup, requiredType);
  60. }
  61. }
  62. // 创建的Bean是否需要进行类型验证,一般不需要
  63. if (!typeCheckOnly) {
  64. // 向容器标记指定的Bean已经被创建
  65. markBeanAsCreated(beanName);
  66. }
  67. try {
  68. // 根据指定Bean名称获取其父级的Bean定义。主要解决Bean继承时子类合并父类公共属性问题
  69. final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  70. checkMergedBeanDefinition(mbd, beanName, args);
  71. // Guarantee initialization of beans that the current bean depends on.
  72. // 获取当前Bean所有依赖Bean的名称
  73. String[] dependsOn = mbd.getDependsOn();
  74. // 如果当前Bean有依赖Bean
  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. // 递归调用getBean方法,获取当前Bean的依赖Bean
  82. registerDependentBean(dep, beanName);
  83. // 把被依赖Bean注册给当前依赖的Bean
  84. getBean(dep);
  85. }
  86. }
  87. // Create bean instance.
  88. // 创建单例模式Bean的实例对象
  89. if (mbd.isSingleton()) {
  90. // 这里使用了一个匿名内部类,创建Bean实例对象,并且注册给所依赖的对象
  91. sharedInstance = getSingleton(beanName, () -> {
  92. try {
  93. // 创建一个指定Bean实例对象,如果有父级继承,则合并子类和父类的定义
  94. return createBean(beanName, mbd, args);
  95. }
  96. catch (BeansException ex) {
  97. // Explicitly remove instance from singleton cache: It might have been put there
  98. // eagerly by the creation process, to allow for circular reference resolution.
  99. // Also remove any beans that received a temporary reference to the bean.
  100. // 显式地从容器单例模式Bean缓存中清除实例对象
  101. destroySingleton(beanName);
  102. throw ex;
  103. }
  104. });
  105. // 获取给定Bean的实例对象
  106. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  107. }
  108. // IOC容器创建原型模式Bean实例对象
  109. else if (mbd.isPrototype()) {
  110. // It's a prototype -> create a new instance.
  111. // 原型模式(Prototype)是每次都会创建一个新的对象
  112. Object prototypeInstance = null;
  113. try {
  114. // 回调beforePrototypeCreation方法,默认的功能是注册当前创建的原型对象
  115. beforePrototypeCreation(beanName);
  116. // 创建指定Bean对象实例
  117. prototypeInstance = createBean(beanName, mbd, args);
  118. }
  119. finally {
  120. // 回调afterPrototypeCreation方法,默认的功能告诉IOC容器指定Bean的原型对象不再创建
  121. afterPrototypeCreation(beanName);
  122. }
  123. // 获取给定Bean的实例对象
  124. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  125. }
  126. // 要创建的Bean既不是单例模式,也不是原型模式,则根据Bean定义资源中配置的生命周期范围,选择实例化Bean的合适方法
  127. // 这种在Web应用程序中比较常用,如:request、session、application等生命周期
  128. else {
  129. String scopeName = mbd.getScope();
  130. final Scope scope = this.scopes.get(scopeName);
  131. // Bean定义资源中没有配置生命周期范围,则Bean定义不合法
  132. if (scope == null) {
  133. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  134. }
  135. try {
  136. // 这里又使用了一个匿名内部类,获取一个指定生命周期范围的实例
  137. Object scopedInstance = scope.get(beanName, () -> {
  138. beforePrototypeCreation(beanName);
  139. try {
  140. return createBean(beanName, mbd, args);
  141. }
  142. finally {
  143. afterPrototypeCreation(beanName);
  144. }
  145. });
  146. // 获取给定Bean的实例对象
  147. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  148. }
  149. catch (IllegalStateException ex) {
  150. throw new BeanCreationException(beanName,
  151. "Scope '" + scopeName + "' is not active for the current thread; consider "
  152. + "defining a scoped proxy for this bean if you intend to referto it from a singleton",
  153. ex);
  154. }
  155. }
  156. }
  157. catch (BeansException ex) {
  158. cleanupAfterBeanCreationFailure(beanName);
  159. throw ex;
  160. }
  161. }
  162. // Check if required type matches the type of the actual bean instance.
  163. // 对创建的Bean实例对象进行类型检查
  164. if (requiredType != null && !requiredType.isInstance(bean)) {
  165. try {
  166. T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
  167. if (convertedBean == null) {
  168. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  169. }
  170. return convertedBean;
  171. }
  172. catch (TypeMismatchException ex) {
  173. if (logger.isDebugEnabled()) {
  174. logger.debug("Failed to convert bean '" + name + "' to required type '"
  175. + ClassUtils.getQualifiedName(requiredType) + "'", ex);
  176. }
  177. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  178. }
  179. }
  180. return (T) bean;
  181. }

通过上面对向 IOC 容器获取 Bean方法的分析,我们可以看到在 Spring 中

  • 若 Bean 定义的单例模式(Singleton),则容器在创建之前先从缓存中查找,以确保整个容器中只存在一个实例对象。
  • 若 Bean定义的是原型模式(Prototype),则容器每次都会创建一个新的实例对象。

除此之外,Bean定义还可以扩展为指定其生命周期范围。

上面的源码只是定义了根据 Bean 定义的模式,采取的不同创建 Bean实例对象的策略,具体的 Bean 实例对象的创建过程由实现了 ObjectFactory 接口的匿名内部类的 createBean()方法完成,ObjectFactory 使用委派模式,具体的 Bean 实例创建过程交由其实现类AbstractAutowireCapableBeanFactory完成。

2.开始实例化 (AbstractAutowireCapableBeanFactory)

AbstractAutowireCapableBeanFactory 类实现了ObjectFactory 接口,创建容器指定的 Bean实例对象,同时还对创建的Bean实例对象进行初始化处理。其创建Bean实例对象的方法源码如下:

createBean()

创建Bean实例对象

  1. @Override
  2. protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {
  3. if (logger.isDebugEnabled()) {
  4. logger.debug("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. // 判断需要创建的Bean是否可以实例化,即是否可以通过当前的类加载器加载
  11. Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
  12. if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
  13. mbdToUse = new RootBeanDefinition(mbd);
  14. mbdToUse.setBeanClass(resolvedClass);
  15. }
  16. // Prepare method overrides.
  17. // 校验和准备Bean中的方法覆盖
  18. try {
  19. mbdToUse.prepareMethodOverrides();
  20. }
  21. catch (BeanDefinitionValidationException ex) {
  22. throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName,
  23. "Validation of method overrides failed", ex);
  24. }
  25. try {
  26. // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
  27. // 如果Bean配置了初始化前和初始化后的处理器,则试图返回一个需要创建Bean的代理对象
  28. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  29. if (bean != null) {
  30. return bean;
  31. }
  32. }
  33. catch (Throwable ex) {
  34. throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
  35. "BeanPostProcessor before instantiation of bean failed", ex);
  36. }
  37. try {
  38. // 创建Bean的入口
  39. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
  40. if (logger.isDebugEnabled()) {
  41. logger.debug("Finished creating instance of bean '" + beanName + "'");
  42. }
  43. return beanInstance;
  44. }
  45. catch (BeanCreationException ex) {
  46. // A previously detected exception with proper bean creation context already...
  47. throw ex;
  48. }
  49. catch (ImplicitlyAppearedSingletonException ex) {
  50. // An IllegalStateException to be communicated up to DefaultSingletonBeanRegistry...
  51. throw ex;
  52. }
  53. catch (Throwable ex) {
  54. throw new BeanCreationException(
  55. mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
  56. }
  57. }

doCreateBean()

真正创建Bean的方法

  1. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
  2. throws BeanCreationException {
  3. // Instantiate the bean.
  4. // 封装被创建的Bean对象
  5. BeanWrapper instanceWrapper = null;
  6. if (mbd.isSingleton()) {
  7. instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  8. }
  9. if (instanceWrapper == null) {
  10. instanceWrapper = createBeanInstance(beanName, mbd, args);
  11. }
  12. final Object bean = instanceWrapper.getWrappedInstance();
  13. // 获取实例化对象的类型
  14. Class<?> beanType = instanceWrapper.getWrappedClass();
  15. if (beanType != NullBean.class) {
  16. mbd.resolvedTargetType = beanType;
  17. }
  18. // Allow post-processors to modify the merged bean definition.
  19. // 调用PostProcessor后置处理器
  20. synchronized (mbd.postProcessingLock) {
  21. if (!mbd.postProcessed) {
  22. try {
  23. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  24. }
  25. catch (Throwable ex) {
  26. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  27. "Post-processing of merged bean definition failed", ex);
  28. }
  29. mbd.postProcessed = true;
  30. }
  31. }
  32. // Eagerly cache singletons to be able to resolve circular references
  33. // even when triggered by lifecycle interfaces like BeanFactoryAware.
  34. // 向容器中缓存单例模式的Bean对象,以防循环引用
  35. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences
  36. && isSingletonCurrentlyInCreation(beanName));
  37. if (earlySingletonExposure) {
  38. if (logger.isDebugEnabled()) {
  39. logger.debug("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");
  40. }
  41. // 这里是一个匿名内部类,为了防止循环引用,尽早持有对象的引用
  42. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  43. }
  44. // Initialize the bean instance.
  45. // Bean对象的初始化,依赖注入在此触发
  46. // 这个exposedObject在初始化完成之后返回作为依赖注入完成后的Bean
  47. Object exposedObject = bean;
  48. try {
  49. // 将Bean实例对象封装,并且Bean定义中配置的属性值赋值给实例对象
  50. populateBean(beanName, mbd, instanceWrapper);
  51. // 初始化Bean对象
  52. exposedObject = initializeBean(beanName, exposedObject, mbd);
  53. }
  54. catch (Throwable ex) {
  55. if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
  56. throw (BeanCreationException) ex;
  57. }
  58. else {
  59. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
  60. }
  61. }
  62. if (earlySingletonExposure) {
  63. // 获取指定名称的已注册的单例模式Bean对象
  64. Object earlySingletonReference = getSingleton(beanName, false);
  65. if (earlySingletonReference != null) {
  66. // 根据名称获取的已注册的Bean和正在实例化的Bean是同一个
  67. if (exposedObject == bean) {
  68. // 当前实例化的Bean初始化完成
  69. exposedObject = earlySingletonReference;
  70. }
  71. // 当前Bean依赖其他Bean,并且当发生循环引用时不允许新创建实例对象
  72. else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName))
  73. {
  74. String[] dependentBeans = getDependentBeans(beanName);
  75. Set<String> actualDependentBeans = new LinkedHashSet<>
  76. (dependentBeans.length);
  77. // 获取当前Bean所依赖的其他Bean
  78. for (String dependentBean : dependentBeans) {
  79. // 对依赖Bean进行类型检查
  80. if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
  81. actualDependentBeans.add(dependentBean);
  82. }
  83. }
  84. if (!actualDependentBeans.isEmpty()) {
  85. throw new BeanCurrentlyInCreationException(beanName,"Bean with name '" + beanName
  86. + "' has been injected into other beans ["
  87. + StringUtils.collectionToCommaDelimitedString(actualDependentBeans)
  88. + "] in its raw version as part of a circular reference, but has eventually been "
  89. + "wrapped. This means that said other beans do not use the final version of the "
  90. + "bean. This is often the result of over-eager type matching -consider using "
  91. + "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
  92. }
  93. }
  94. }
  95. }
  96. // Register bean as disposable.
  97. // 注册完成依赖注入的Bean
  98. try {
  99. registerDisposableBeanIfNecessary(beanName, bean, mbd);
  100. }
  101. catch (BeanDefinitionValidationException ex) {
  102. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  103. "Invalid destruction signature", ex);
  104. }
  105. return exposedObject;
  106. }

通过上面的源码注释,我们看到具体的依赖注入实现其实就在以下两个方法中

  • createBeanInstance()方法,生成Bean所包含的java对象实例。
  • populateBean()方法,对Bean属性的依赖注入进行处理。

下面继续分析这两个方法的代码实现。

3.选择Bean实例化策略 (AbstractAutowireCapableBeanFactory)

createBeanInstance()

根据指定的初始化策略,使用简单工厂、工厂方法或者容器的自动装配特性生成Java实例对象,创建对象的源码如下:

  1. // 创建Bean的实例对象
  2. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable
  3. Object[] args) {
  4. // Make sure bean class is actually resolved at this point.
  5. // 检查确认Bean是可实例化的
  6. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  7. // 使用工厂方法对Bean进行实例化
  8. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  9. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  10. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
  11. }
  12. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  13. if (instanceSupplier != null) {
  14. return obtainFromSupplier(instanceSupplier, beanName);
  15. }
  16. if (mbd.getFactoryMethodName() != null) {
  17. // 调用工厂方法实例化
  18. return instantiateUsingFactoryMethod(beanName, mbd, args);
  19. }
  20. // Shortcut when re-creating the same bean...
  21. // 使用容器的自动装配方法进行实例化
  22. boolean resolved = false;
  23. boolean autowireNecessary = false;
  24. if (args == null) {
  25. synchronized (mbd.constructorArgumentLock) {
  26. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  27. resolved = true;
  28. autowireNecessary = mbd.constructorArgumentsResolved;
  29. }
  30. }
  31. }
  32. if (resolved) {
  33. if (autowireNecessary) {
  34. // 配置了自动装配属性,使用容器的自动装配实例化
  35. // 容器的自动装配是根据参数类型匹配Bean的构造方法
  36. return autowireConstructor(beanName, mbd, null, null);
  37. }
  38. else {
  39. // 使用默认的无参构造方法实例化
  40. return instantiateBean(beanName, mbd);
  41. }
  42. }
  43. // Need to determine the constructor...
  44. // 使用Bean的构造方法进行实例化
  45. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  46. if (ctors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR
  47. ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  48. // 使用容器的自动装配特性,调用匹配的构造方法实例化
  49. return autowireConstructor(beanName, mbd, ctors, args);
  50. }
  51. // No special handling: simply use no-arg constructor.
  52. // 使用默认的无参构造方法实例化
  53. return instantiateBean(beanName, mbd);
  54. }

instantiateBean()

使用默认的无参构造方法实例化Bean对象

  1. protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
  2. try {
  3. Object beanInstance;
  4. final BeanFactory parent = this;
  5. // 获取系统的安全管理接口,JDK标准的安全管理API
  6. if (System.getSecurityManager() != null) {
  7. // 这里是一个匿名内置类,根据实例化策略创建实例对象
  8. beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
  9. getInstantiationStrategy().instantiate(mbd, beanName, parent),getAccessControlContext());
  10. }
  11. else {
  12. // 将实例化的对象封装起来
  13. beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
  14. }
  15. BeanWrapper bw = new BeanWrapperImpl(beanInstance);
  16. initBeanWrapper(bw);
  17. return bw;
  18. }
  19. catch (Throwable ex) {
  20. throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
  21. }
  22. }

经过对上面的代码分析,我们可以看出,对使用工厂方法和自动装配特性的Bean的实例化相当比较清楚,调用相应的工厂方法或者参数匹配的构造方法即可完成实例化对象的工作,但是对于我们最常使用的默认无参构造方法就需要使用相应的初始化策略(JDK的反射机制或者CGLib)来进行初始化了,在方法getInstantiationStrategy().instantiate()中就具体实现类使用初始策略实例化对象。

4.执行Bean实例化 (SimpleInstantiationStrategy)

在使用默认的无参构造方法创建Bean的实例化对象时,方法getInstantiationStrategy().instantiate()调用了SimpleInstantiationStrategy类中的实例化Bean的方法,其源码如下:

instantiate()

使用初始化策略实例化Bean对象

  1. @Override
  2. public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner)
  3. {
  4. // Don't override the class with CGLIB if no overrides.
  5. // 如果Bean定义中没有方法覆盖,则就不需要CGLIB父类类的方法
  6. if (!bd.hasMethodOverrides()) {
  7. Constructor<?> constructorToUse;
  8. synchronized (bd.constructorArgumentLock) {
  9. // 获取对象的构造方法或工厂方法
  10. constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
  11. // 如果没有构造方法且没有工厂方法
  12. if (constructorToUse == null) {
  13. // 使用JDK的反射机制,判断要实例化的Bean是否是接口
  14. final Class<?> clazz = bd.getBeanClass();
  15. if (clazz.isInterface()) {
  16. throw new BeanInstantiationException(clazz, "Specified class is an interface");
  17. }
  18. try {
  19. if (System.getSecurityManager() != null) {
  20. // 这里是一个匿名内置类,使用反射机制获取Bean的构造方法
  21. constructorToUse = AccessController.doPrivileged(
  22. (PrivilegedExceptionAction<Constructor<?>>) () -> clazz.getDeclaredConstructor());
  23. }
  24. else {
  25. constructorToUse = clazz.getDeclaredConstructor();
  26. }
  27. bd.resolvedConstructorOrFactoryMethod = constructorToUse;
  28. }
  29. catch (Throwable ex) {
  30. throw new BeanInstantiationException(clazz, "No default constructor found", ex);
  31. }
  32. }
  33. }
  34. // 使用BeanUtils实例化,通过反射机制调用”构造方法.newInstance(arg)”来进行实例化
  35. return BeanUtils.instantiateClass(constructorToUse);
  36. }
  37. else {
  38. // Must generate CGLIB subclass.
  39. // 使用CGLIB来实例化对象
  40. return instantiateWithMethodInjection(bd, beanName, owner);
  41. }
  42. }

通过上面的代码分析,我们看到了如果Bean有方法被覆盖了,则使用JDK的反射机制进行实例化,否则,使用CGLib进行实例化。

instantiateWithMethodInjection() 方法调用 SimpleInstantiationStrategy 子类CGLibSubclassingInstantiationStrategy使用CGLib来进行初始化,其源码如下:

instantiate()

使用CGLIB进行Bean对象实例化。

CGLib是一个常用的字节码生成器的类库,它提供了一系列API 实现Java字节码的生成和转换功能。而JDK的动态代理只能针对接口,如果一个类没有实现任何接口,要对其进行动态代理只能使用CGLib。

  1. public Object instantiate(@Nullable Constructor<?> ctor, @Nullable Object... args) {
  2. // 创建代理子类
  3. Class<?> subclass = createEnhancedSubclass(this.beanDefinition);
  4. Object instance;
  5. if (ctor == null) {
  6. instance = BeanUtils.instantiateClass(subclass);
  7. }
  8. else {
  9. try {
  10. Constructor<?> enhancedSubclassConstructor = subclass.getConstructor(ctor.getParameterTypes());
  11. instance = enhancedSubclassConstructor.newInstance(args);
  12. }
  13. catch (Exception ex) {
  14. throw new BeanInstantiationException(this.beanDefinition.getBeanClass(),
  15. "Failed to invoke constructor for CGLIB enhanced subclass [" + subclass.getName() + "]", ex);
  16. }
  17. }
  18. // SPR-10785: set callbacks directly on the instance instead of in the
  19. // enhanced class (via the Enhancer) in order to avoid memory leaks.
  20. Factory factory = (Factory) instance;
  21. factory.setCallbacks(new Callback[] { NoOp.INSTANCE,
  22. new LookupOverrideMethodInterceptor(this.beanDefinition, this.owner),
  23. new ReplaceOverrideMethodInterceptor(this.beanDefinition, this.owner)});
  24. return instance;
  25. }
  26. private Class<?> createEnhancedSubclass(RootBeanDefinition beanDefinition) {
  27. // CGLIB中的类
  28. Enhancer enhancer = new Enhancer();
  29. // 将Bean本身作为其基类
  30. enhancer.setSuperclass(beanDefinition.getBeanClass());
  31. enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
  32. if (this.owner instanceof ConfigurableBeanFactory) {
  33. ClassLoader cl = ((ConfigurableBeanFactory) this.owner).getBeanClassLoader();
  34. enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(cl));
  35. }
  36. enhancer.setCallbackFilter(new MethodOverrideCallbackFilter(beanDefinition));
  37. enhancer.setCallbackTypes(CALLBACK_TYPES);
  38. // 使用CGLIB的createClass方法生成实例对象
  39. return enhancer.createClass();
  40. }

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读