• 概括的描述一下Spring注册流程


    Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一遍学习的时候,不用关注全部细节,不重要的代码可以先忽略掉,达到理解大体的架子及流程,避免第一次就陷入某个坑里出不来。第二遍针对某个流程更深入的、有针对性的去分析学习,当然遇到某个实在过不去的坎可以标记,后面再思考,毕竟是别人设计的,有些不是那么容易理解,可以使用google,次数多了,总会有收获!

    概括的描述一下Spring背后的操作,解析applicationgContext.xml,将xml中定义的bean(如loginService和loginResource)解析成Spring内部的BeanDefinition,并以beanName(如loginService)为key,BeanDefinition(如loginService相应的BeanDefinition)为value存储到DefaultListableBeanFactory中的beanDefinitionMap(其实就是一个ConcurrentHashMap)中,同时将beanName存入beanDefinitionNames(List类型)中,然后遍历beanDefinitionNames中的beanName,进行bean的实例化并填充属性,在实例化的过程中,如果有依赖没有被实例化将先实例化其依赖,然后实例化本身,实例化完成后将实例存入单例bean的缓存中,当调用getBean方法时,到单例bean的缓存中查找,如果找到并经过转换后返回这个实例(如LoginResource的实例),之后就可以直接使用了。

    上边提到在Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构,BeanDefinition的内部结构。直接看BeanDefinition源码

    1. public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    2. /**
    3. * Scope identifier for the standard singleton scope: "singleton".
    4. * <p>Note that extended bean factories might support further scopes.
    5. */
    6. String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    7. /**
    8. * Scope identifier for the standard prototype scope: "prototype".
    9. * <p>Note that extended bean factories might support further scopes.
    10. */
    11. String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    12. /**
    13. * Role hint indicating that a {@code BeanDefinition} is a major part
    14. * of the application. Typically corresponds to a user-defined bean.
    15. */
    16. int ROLE_APPLICATION = 0;
    17. /**
    18. * Role hint indicating that a {@code BeanDefinition} is a supporting
    19. * part of some larger configuration, typically an outer
    20. * {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
    21. * {@code SUPPORT} beans are considered important enough to be aware
    22. * of when looking more closely at a particular
    23. * {@link org.springframework.beans.factory.parsing.ComponentDefinition},
    24. * but not when looking at the overall configuration of an application.
    25. */
    26. int ROLE_SUPPORT = 1;
    27. /**
    28. * Role hint indicating that a {@code BeanDefinition} is providing an
    29. * entirely background role and has no relevance to the end-user. This hint is
    30. * used when registering beans that are completely part of the internal workings
    31. * of a {@link org.springframework.beans.factory.parsing.ComponentDefinition}.
    32. */
    33. int ROLE_INFRASTRUCTURE = 2;
    34. /**
    35. * Return the name of the parent definition of this bean definition, if any.
    36. */
    37. String getParentName();
    38. /**
    39. * Set the name of the parent definition of this bean definition, if any.
    40. */
    41. void setParentName(String parentName);
    42. /**
    43. * Return the current bean class name of this bean definition.
    44. * <p>Note that this does not have to be the actual class name used at runtime, in
    45. * case of a child definition overriding/inheriting the class name from its parent.
    46. * Hence, do <i>not</i> consider this to be the definitive bean type at runtime but
    47. * rather only use it for parsing purposes at the individual bean definition level.
    48. */
    49. String getBeanClassName();
    50. /**
    51. * Override the bean class name of this bean definition.
    52. * <p>The class name can be modified during bean factory post-processing,
    53. * typically replacing the original class name with a parsed variant of it.
    54. */
    55. void setBeanClassName(String beanClassName);
    56. /**
    57. * Return the factory bean name, if any.
    58. */
    59. String getFactoryBeanName();
    60. /**
    61. * Specify the factory bean to use, if any.
    62. */
    63. void setFactoryBeanName(String factoryBeanName);
    64. /**
    65. * Return a factory method, if any.
    66. */
    67. String getFactoryMethodName();
    68. /**
    69. * Specify a factory method, if any. This method will be invoked with
    70. * constructor arguments, or with no arguments if none are specified.
    71. * The method will be invoked on the specified factory bean, if any,
    72. * or otherwise as a static method on the local bean class.
    73. * @param factoryMethodName static factory method name,
    74. * or {@code null} if normal constructor creation should be used
    75. */
    76. void setFactoryMethodName(String factoryMethodName);
    77. /**
    78. * Return the name of the current target scope for this bean,
    79. * or {@code null} if not known yet.
    80. */
    81. String getScope();
    82. /**
    83. * Override the target scope of this bean, specifying a new scope name.
    84. */
    85. void setScope(String scope);
    86. /**
    87. * Return whether this bean should be lazily initialized, i.e. not
    88. * eagerly instantiated on startup. Only applicable to a singleton bean.
    89. */
    90. boolean isLazyInit();
    91. /**
    92. * Set whether this bean should be lazily initialized.
    93. * <p>If {@code false}, the bean will get instantiated on startup by bean
    94. * factories that perform eager initialization of singletons.
    95. */
    96. void setLazyInit(boolean lazyInit);
    97. /**
    98. * Return the bean names that this bean depends on.
    99. */
    100. String[] getDependsOn();
    101. /**
    102. * Set the names of the beans that this bean depends on being initialized.
    103. * The bean factory will guarantee that these beans get initialized first.
    104. */
    105. void setDependsOn(String... dependsOn);
    106. /**
    107. * Return whether this bean is a candidate for getting autowired into some other bean.
    108. */
    109. boolean isAutowireCandidate();
    110. /**
    111. * Set whether this bean is a candidate for getting autowired into some other bean.
    112. */
    113. void setAutowireCandidate(boolean autowireCandidate);
    114. /**
    115. * Return whether this bean is a primary autowire candidate.
    116. * If this value is true for exactly one bean among multiple
    117. * matching candidates, it will serve as a tie-breaker.
    118. */
    119. boolean isPrimary();
    120. /**
    121. * Set whether this bean is a primary autowire candidate.
    122. * <p>If this value is true for exactly one bean among multiple
    123. * matching candidates, it will serve as a tie-breaker.
    124. */
    125. void setPrimary(boolean primary);
    126. /**
    127. * Return the constructor argument values for this bean.
    128. * <p>The returned instance can be modified during bean factory post-processing.
    129. * @return the ConstructorArgumentValues object (never {@code null})
    130. */
    131. ConstructorArgumentValues getConstructorArgumentValues();
    132. /**
    133. * Return the property values to be applied to a new instance of the bean.
    134. * <p>The returned instance can be modified during bean factory post-processing.
    135. * @return the MutablePropertyValues object (never {@code null})
    136. */
    137. MutablePropertyValues getPropertyValues();
    138. /**
    139. * Return whether this a <b>Singleton</b>, with a single, shared instance
    140. * returned on all calls.
    141. */
    142. boolean isSingleton();
    143. /**
    144. * Return whether this a <b>Prototype</b>, with an independent instance
    145. * returned for each call.
    146. */
    147. boolean isPrototype();
    148. /**
    149. * Return whether this bean is "abstract", that is, not meant to be instantiated.
    150. */
    151. boolean isAbstract();
    152. /**
    153. * Get the role hint for this {@code BeanDefinition}. The role hint
    154. * provides the frameworks as well as tools with an indication of
    155. * the role and importance of a particular {@code BeanDefinition}.
    156. */
    157. int getRole();
    158. /**
    159. * Return a human-readable description of this bean definition.
    160. */
    161. String getDescription();
    162. /**
    163. * Return a description of the resource that this bean definition
    164. * came from (for the purpose of showing context in case of errors).
    165. */
    166. String getResourceDescription();
    167. /**
    168. * Return the originating BeanDefinition, or {@code null} if none.
    169. * Allows for retrieving the decorated bean definition, if any.
    170. * <p>Note that this method returns the immediate originator. Iterate through the
    171. * originator chain to find the original BeanDefinition as defined by the user.
    172. */
    173. BeanDefinition getOriginatingBeanDefinition();
    174. }


    可以看到上面的很多属性和方法都很熟悉,例如类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后面对Bean的操作就直接对BeanDefinition进行,例如拿到这个BeanDefinition后,可以根据里面的类名、构造函数、构造函数参数,使用反射进行对象创建。BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。BeanDefinition继承了AttributeAccessor,说明它具有处理属性的能力;BeanDefinition继承了BeanMetadataElement,说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object。

  • 相关阅读:
    SqlServer数据库同步方案详解(包括跨网段)
    makefile 和shell文件相互调用
    处理百万级以上的数据处理
    makefile Template(添加多个lib)
    Linux下如何删除非空目录
    makefile Template
    g++ 编译和链接
    gcc include路径
    C++ XML解析之TinyXML篇
    利用Lucene.net搭建站内搜索(2)分词技术
  • 原文地址:https://www.cnblogs.com/yibutian/p/9588036.html
Copyright © 2020-2023  润新知