Spring 中 Bean 的配置细节

打印 上一主题 下一主题

主题 936|帖子 936|积分 2808

前言

大家好,我是 god23bin,今天继续说 Spring 的内容,关于 Spring 中 Bean 的配置的,通过上一篇文章的学习,我们知道了 Spring 中的依赖注入,其中有两种主要的方式,分别是基于构造方法的 DI基于 Setter 的 DI
我们知道,当写完一个普通的 Java 类后,想让 Spring IoC 容器在创建类的实例对象时使用构造方法完成实例对象的依赖注入,那么就需要在配置元数据中写好类的 Bean 定义,包括各种标签的属性。
如果你是第一次看我这个系列的文章,可能不知道什么是配置元数据,不知道什么是依赖注入,那么请你先去看看我之前的文章,相信对你是有帮助的~
现在我们来说说这其中的配置细节,废话不多说,开始啦!
Bean 定义中的基本标签

property

property 标签:用于注入简单属性值,可以通过 name 属性指定属性名称,通过 value 属性指定属性值,或者通过 ref 属性指定引用其他 Bean。
  1. <bean id="employee" >
  2. <bean id="a" >
  3. <bean id="employee"  autowire="byName">
  4. <bean id="employee"  autowire="byType">
  5. <bean id="employee"  autowire="constructor">
  6.    
  7. </bean>
  8. </bean>
  9. </bean><property name="b" ref="b" />
  10. </bean>
  11. <bean id="b" /><property name="id" value="1" />
  12. <bean id="a" >
  13. <bean id="employee"  autowire="byName">
  14. <bean id="employee"  autowire="byType">
  15. <bean id="employee"  autowire="constructor">
  16.    
  17. </bean>
  18. </bean>
  19. </bean><property name="b" ref="b" />
  20. </bean>
  21. <bean id="b" /><property name="name" value="god23bin" />
  22. <bean id="a" >
  23. <bean id="employee"  autowire="byName">
  24. <bean id="employee"  autowire="byType">
  25. <bean id="employee"  autowire="constructor">
  26.    
  27. </bean>
  28. </bean>
  29. </bean><property name="b" ref="b" />
  30. </bean>
  31. <bean id="b" /><property name="department" ref="department" />
  32. </bean>
  33. <bean id="department" >
  34. <bean id="a" >
  35. <bean id="employee"  autowire="byName">
  36. <bean id="employee"  autowire="byType">
  37. <bean id="employee"  autowire="constructor">
  38.    
  39. </bean>
  40. </bean>
  41. </bean><property name="b" ref="b" />
  42. </bean>
  43. <bean id="b" /><property name="id" value="1" />
  44. <bean id="a" >
  45. <bean id="employee"  autowire="byName">
  46. <bean id="employee"  autowire="byType">
  47. <bean id="employee"  autowire="constructor">
  48.    
  49. </bean>
  50. </bean>
  51. </bean><property name="b" ref="b" />
  52. </bean>
  53. <bean id="b" /><property name="name" value="JUST DO IT" />
  54. </bean>
复制代码
constructor

constructor 标签:使用构造方法参数值进行注入。通过 value 属性指定了参数的具体值,或通过 ref 属性指定了对其他 Bean 的引用。这样,在容器创建 Bean 实例时,会使用指定的参数值调用构造方法,实现构造方法注入。
  1. <bean id="employee" >
  2. <bean id="a" >
  3. <bean id="employee"  autowire="byName">
  4. <bean id="employee"  autowire="byType">
  5. <bean id="employee"  autowire="constructor">
  6.    
  7. </bean>
  8. </bean>
  9. </bean><property name="b" ref="b" />
  10. </bean>
  11. <bean id="b" /><property name="id" value="1" />
  12. <bean id="a" >
  13. <bean id="employee"  autowire="byName">
  14. <bean id="employee"  autowire="byType">
  15. <bean id="employee"  autowire="constructor">
  16.    
  17. </bean>
  18. </bean>
  19. </bean><property name="b" ref="b" />
  20. </bean>
  21. <bean id="b" /><property name="name" value="god23bin" />
  22. <bean id="a" >
  23. <bean id="employee"  autowire="byName">
  24. <bean id="employee"  autowire="byType">
  25. <bean id="employee"  autowire="constructor">
  26.    
  27. </bean>
  28. </bean>
  29. </bean><property name="b" ref="b" />
  30. </bean>
  31. <bean id="b" /><property name="department" ref="department" />
  32. </bean>
  33. <bean id="department" >
  34. <bean id="a" >
  35. <bean id="employee"  autowire="byName">
  36. <bean id="employee"  autowire="byType">
  37. <bean id="employee"  autowire="constructor">
  38.    
  39. </bean>
  40. </bean>
  41. </bean><property name="b" ref="b" />
  42. </bean>
  43. <bean id="b" /><property name="id" value="1" />
  44. <bean id="a" >
  45. <bean id="employee"  autowire="byName">
  46. <bean id="employee"  autowire="byType">
  47. <bean id="employee"  autowire="constructor">
  48.    
  49. </bean>
  50. </bean>
  51. </bean><property name="b" ref="b" />
  52. </bean>
  53. <bean id="b" /><property name="name" value="JUST DO IT" />
  54. </bean>
复制代码
list

list 标签:用于注入 List 集合类型的属性值,可以通过value 子标签指定元素的值,或者通过 ref 子标签指定引用其他 Bean。
  1. <bean id="employee" >
  2. <bean id="a" >
  3. <bean id="employee"  autowire="byName">
  4. <bean id="employee"  autowire="byType">
  5. <bean id="employee"  autowire="constructor">
  6.    
  7. </bean>
  8. </bean>
  9. </bean><property name="b" ref="b" />
  10. </bean>
  11. <bean id="b" /><property name="id" value="1" />
  12. <bean id="a" >
  13. <bean id="employee"  autowire="byName">
  14. <bean id="employee"  autowire="byType">
  15. <bean id="employee"  autowire="constructor">
  16.    
  17. </bean>
  18. </bean>
  19. </bean><property name="b" ref="b" />
  20. </bean>
  21. <bean id="b" /><property name="name" value="god23bin" />
  22. <bean id="a" >
  23. <bean id="employee"  autowire="byName">
  24. <bean id="employee"  autowire="byType">
  25. <bean id="employee"  autowire="constructor">
  26.    
  27. </bean>
  28. </bean>
  29. </bean><property name="b" ref="b" />
  30. </bean>
  31. <bean id="b" /><property name="department" ref="department" />
  32. </bean>
  33. <bean id="department" >
  34. <bean id="a" >
  35. <bean id="employee"  autowire="byName">
  36. <bean id="employee"  autowire="byType">
  37. <bean id="employee"  autowire="constructor">
  38.    
  39. </bean>
  40. </bean>
  41. </bean><property name="b" ref="b" />
  42. </bean>
  43. <bean id="b" /><property name="id" value="1" />
  44. <bean id="a" >
  45. <bean id="employee"  autowire="byName">
  46. <bean id="employee"  autowire="byType">
  47. <bean id="employee"  autowire="constructor">
  48.    
  49. </bean>
  50. </bean>
  51. </bean><property name="b" ref="b" />
  52. </bean>
  53. <bean id="b" /><property name="name" value="JUST DO IT" />
  54. </bean><bean id="a" >
  55. <bean id="employee"  autowire="byName">
  56. <bean id="employee"  autowire="byType">
  57. <bean id="employee"  autowire="constructor">
  58.    
  59. </bean>
  60. </bean>
  61. </bean><property name="b" ref="b" />
  62. </bean>
  63. <bean id="b" />Java<bean id="a" >
  64. <bean id="employee"  autowire="byName">
  65. <bean id="employee"  autowire="byType">
  66. <bean id="employee"  autowire="constructor">
  67.    
  68. </bean>
  69. </bean>
  70. </bean><property name="b" ref="b" />
  71. </bean>
  72. <bean id="b" /><bean id="a" >
  73. <bean id="employee"  autowire="byName">
  74. <bean id="employee"  autowire="byType">
  75. <bean id="employee"  autowire="constructor">
  76.    
  77. </bean>
  78. </bean>
  79. </bean><property name="b" ref="b" />
  80. </bean>
  81. <bean id="b" /><bean id="a" >
  82. <bean id="employee"  autowire="byName">
  83. <bean id="employee"  autowire="byType">
  84. <bean id="employee"  autowire="constructor">
  85.    
  86. </bean>
  87. </bean>
  88. </bean><property name="b" ref="b" />
  89. </bean>
  90. <bean id="b" />Spring<bean id="a" >
  91. <bean id="employee"  autowire="byName">
  92. <bean id="employee"  autowire="byType">
  93. <bean id="employee"  autowire="constructor">
  94.    
  95. </bean>
  96. </bean>
  97. </bean><property name="b" ref="b" />
  98. </bean>
  99. <bean id="b" /><bean id="a" >
  100. <bean id="employee"  autowire="byName">
  101. <bean id="employee"  autowire="byType">
  102. <bean id="employee"  autowire="constructor">
  103.    
  104. </bean>
  105. </bean>
  106. </bean><property name="b" ref="b" />
  107. </bean>
  108. <bean id="b" /><bean id="a" >
  109. <bean id="employee"  autowire="byName">
  110. <bean id="employee"  autowire="byType">
  111. <bean id="employee"  autowire="constructor">
  112.    
  113. </bean>
  114. </bean>
  115. </bean><property name="b" ref="b" />
  116. </bean>
  117. <bean id="b" />MySQL<bean id="employee" >
  118. <bean id="a" >
  119. <bean id="employee"  autowire="byName">
  120. <bean id="employee"  autowire="byType">
  121. <bean id="employee"  autowire="constructor">
  122.    
  123. </bean>
  124. </bean>
  125. </bean><property name="b" ref="b" />
  126. </bean>
  127. <bean id="b" /><property name="id" value="1" />
  128. <bean id="a" >
  129. <bean id="employee"  autowire="byName">
  130. <bean id="employee"  autowire="byType">
  131. <bean id="employee"  autowire="constructor">
  132.    
  133. </bean>
  134. </bean>
  135. </bean><property name="b" ref="b" />
  136. </bean>
  137. <bean id="b" /><property name="name" value="god23bin" />
  138. <bean id="a" >
  139. <bean id="employee"  autowire="byName">
  140. <bean id="employee"  autowire="byType">
  141. <bean id="employee"  autowire="constructor">
  142.    
  143. </bean>
  144. </bean>
  145. </bean><property name="b" ref="b" />
  146. </bean>
  147. <bean id="b" /><property name="department" ref="department" />
  148. </bean>
  149. <bean id="department" >
  150. <bean id="a" >
  151. <bean id="employee"  autowire="byName">
  152. <bean id="employee"  autowire="byType">
  153. <bean id="employee"  autowire="constructor">
  154.    
  155. </bean>
  156. </bean>
  157. </bean><property name="b" ref="b" />
  158. </bean>
  159. <bean id="b" /><property name="id" value="1" />
  160. <bean id="a" >
  161. <bean id="employee"  autowire="byName">
  162. <bean id="employee"  autowire="byType">
  163. <bean id="employee"  autowire="constructor">
  164.    
  165. </bean>
  166. </bean>
  167. </bean><property name="b" ref="b" />
  168. </bean>
  169. <bean id="b" /><property name="name" value="JUST DO IT" />
  170. </bean><bean id="a" >
  171. <bean id="employee"  autowire="byName">
  172. <bean id="employee"  autowire="byType">
  173. <bean id="employee"  autowire="constructor">
  174.    
  175. </bean>
  176. </bean>
  177. </bean><property name="b" ref="b" />
  178. </bean>
  179. <bean id="b" /><bean id="a" >
  180. <bean id="employee"  autowire="byName">
  181. <bean id="employee"  autowire="byType">
  182. <bean id="employee"  autowire="constructor">
  183.    
  184. </bean>
  185. </bean>
  186. </bean><property name="b" ref="b" />
  187. </bean>
  188. <bean id="b" /><bean id="a" >
  189. <bean id="employee"  autowire="byName">
  190. <bean id="employee"  autowire="byType">
  191. <bean id="employee"  autowire="constructor">
  192.    
  193. </bean>
  194. </bean>
  195. </bean><property name="b" ref="b" />
  196. </bean>
  197. <bean id="b" />        <bean id="employee" >
  198. <bean id="a" >
  199. <bean id="employee"  autowire="byName">
  200. <bean id="employee"  autowire="byType">
  201. <bean id="employee"  autowire="constructor">
  202.    
  203. </bean>
  204. </bean>
  205. </bean><property name="b" ref="b" />
  206. </bean>
  207. <bean id="b" /><property name="id" value="1" />
  208. <bean id="a" >
  209. <bean id="employee"  autowire="byName">
  210. <bean id="employee"  autowire="byType">
  211. <bean id="employee"  autowire="constructor">
  212.    
  213. </bean>
  214. </bean>
  215. </bean><property name="b" ref="b" />
  216. </bean>
  217. <bean id="b" /><property name="name" value="god23bin" />
  218. <bean id="a" >
  219. <bean id="employee"  autowire="byName">
  220. <bean id="employee"  autowire="byType">
  221. <bean id="employee"  autowire="constructor">
  222.    
  223. </bean>
  224. </bean>
  225. </bean><property name="b" ref="b" />
  226. </bean>
  227. <bean id="b" /><property name="department" ref="department" />
  228. </bean>
  229. <bean id="department" >
  230. <bean id="a" >
  231. <bean id="employee"  autowire="byName">
  232. <bean id="employee"  autowire="byType">
  233. <bean id="employee"  autowire="constructor">
  234.    
  235. </bean>
  236. </bean>
  237. </bean><property name="b" ref="b" />
  238. </bean>
  239. <bean id="b" /><property name="id" value="1" />
  240. <bean id="a" >
  241. <bean id="employee"  autowire="byName">
  242. <bean id="employee"  autowire="byType">
  243. <bean id="employee"  autowire="constructor">
  244.    
  245. </bean>
  246. </bean>
  247. </bean><property name="b" ref="b" />
  248. </bean>
  249. <bean id="b" /><property name="name" value="JUST DO IT" />
  250. </bean><bean id="a" >
  251. <bean id="employee"  autowire="byName">
  252. <bean id="employee"  autowire="byType">
  253. <bean id="employee"  autowire="constructor">
  254.    
  255. </bean>
  256. </bean>
  257. </bean><property name="b" ref="b" />
  258. </bean>
  259. <bean id="b" />
复制代码
set

set 标签:用于注入 Set 集合类型的属性值,用法和 list 标签类似。
  1. <bean id="employee" >
  2.   <property name="setProperty">
  3. <bean id="a" >
  4. <bean id="employee"  autowire="byName">
  5. <bean id="employee"  autowire="byType">
  6. <bean id="employee"  autowire="constructor">
  7.    
  8. </bean>
  9. </bean>
  10. </bean><property name="b" ref="b" />
  11. </bean>
  12. <bean id="b" /><set>
  13. <bean id="a" >
  14. <bean id="employee"  autowire="byName">
  15. <bean id="employee"  autowire="byType">
  16. <bean id="employee"  autowire="constructor">
  17.    
  18. </bean>
  19. </bean>
  20. </bean><property name="b" ref="b" />
  21. </bean>
  22. <bean id="b" />  <value>Value 1</value>
  23. <bean id="a" >
  24. <bean id="employee"  autowire="byName">
  25. <bean id="employee"  autowire="byType">
  26. <bean id="employee"  autowire="constructor">
  27.    
  28. </bean>
  29. </bean>
  30. </bean><property name="b" ref="b" />
  31. </bean>
  32. <bean id="b" />  <ref bean="bean1"/>
  33. <bean id="a" >
  34. <bean id="employee"  autowire="byName">
  35. <bean id="employee"  autowire="byType">
  36. <bean id="employee"  autowire="constructor">
  37.    
  38. </bean>
  39. </bean>
  40. </bean><property name="b" ref="b" />
  41. </bean>
  42. <bean id="b" />  <ref bean="bean2"/>
  43. <bean id="a" >
  44. <bean id="employee"  autowire="byName">
  45. <bean id="employee"  autowire="byType">
  46. <bean id="employee"  autowire="constructor">
  47.    
  48. </bean>
  49. </bean>
  50. </bean><property name="b" ref="b" />
  51. </bean>
  52. <bean id="b" /></set>
  53.   </property>
  54. </bean>
复制代码
map

map 标签:用于注入 Map 集合类型的属性值,可以通过 entry 子标签指定键值对,键可以通过 key 属性指定,值可以通过 value 属性指定,或者通过 ref 子标签指定引用其他Bean。
  1. <bean id="employee" >
  2. <bean id="a" >
  3. <bean id="employee"  autowire="byName">
  4. <bean id="employee"  autowire="byType">
  5. <bean id="employee"  autowire="constructor">
  6.    
  7. </bean>
  8. </bean>
  9. </bean><property name="b" ref="b" />
  10. </bean>
  11. <bean id="b" /><property name="id" value="1" />
  12. <bean id="a" >
  13. <bean id="employee"  autowire="byName">
  14. <bean id="employee"  autowire="byType">
  15. <bean id="employee"  autowire="constructor">
  16.    
  17. </bean>
  18. </bean>
  19. </bean><property name="b" ref="b" />
  20. </bean>
  21. <bean id="b" /><property name="name" value="god23bin" />
  22. <bean id="a" >
  23. <bean id="employee"  autowire="byName">
  24. <bean id="employee"  autowire="byType">
  25. <bean id="employee"  autowire="constructor">
  26.    
  27. </bean>
  28. </bean>
  29. </bean><property name="b" ref="b" />
  30. </bean>
  31. <bean id="b" /><property name="department" ref="department" />
  32. </bean>
  33. <bean id="department" >
  34. <bean id="a" >
  35. <bean id="employee"  autowire="byName">
  36. <bean id="employee"  autowire="byType">
  37. <bean id="employee"  autowire="constructor">
  38.    
  39. </bean>
  40. </bean>
  41. </bean><property name="b" ref="b" />
  42. </bean>
  43. <bean id="b" /><property name="id" value="1" />
  44. <bean id="a" >
  45. <bean id="employee"  autowire="byName">
  46. <bean id="employee"  autowire="byType">
  47. <bean id="employee"  autowire="constructor">
  48.    
  49. </bean>
  50. </bean>
  51. </bean><property name="b" ref="b" />
  52. </bean>
  53. <bean id="b" /><property name="name" value="JUST DO IT" />
  54. </bean><bean id="a" >
  55. <bean id="employee"  autowire="byName">
  56. <bean id="employee"  autowire="byType">
  57. <bean id="employee"  autowire="constructor">
  58.    
  59. </bean>
  60. </bean>
  61. </bean><property name="b" ref="b" />
  62. </bean>
  63. <bean id="b" /><bean id="a" >
  64. <bean id="employee"  autowire="byName">
  65. <bean id="employee"  autowire="byType">
  66. <bean id="employee"  autowire="constructor">
  67.    
  68. </bean>
  69. </bean>
  70. </bean><property name="b" ref="b" />
  71. </bean>
  72. <bean id="b" /><bean id="a" >
  73. <bean id="employee"  autowire="byName">
  74. <bean id="employee"  autowire="byType">
  75. <bean id="employee"  autowire="constructor">
  76.    
  77. </bean>
  78. </bean>
  79. </bean><property name="b" ref="b" />
  80. </bean>
  81. <bean id="b" /><bean id="a" >
  82. <bean id="employee"  autowire="byName">
  83. <bean id="employee"  autowire="byType">
  84. <bean id="employee"  autowire="constructor">
  85.    
  86. </bean>
  87. </bean>
  88. </bean><property name="b" ref="b" />
  89. </bean>
  90. <bean id="b" />  
复制代码
props 标签:用于注入 Properties 类型的属性值,可以通过 prop 子标签指定键值对,键可以通过 key 属性指定,值可以通过 value 属性指定。
  1. <bean id="employee" >
  2.   <property name="propsProperty">
  3. <bean id="a" >
  4. <bean id="employee"  autowire="byName">
  5. <bean id="employee"  autowire="byType">
  6. <bean id="employee"  autowire="constructor">
  7.    
  8. </bean>
  9. </bean>
  10. </bean><property name="b" ref="b" />
  11. </bean>
  12. <bean id="b" /><props>
  13. <bean id="a" >
  14. <bean id="employee"  autowire="byName">
  15. <bean id="employee"  autowire="byType">
  16. <bean id="employee"  autowire="constructor">
  17.    
  18. </bean>
  19. </bean>
  20. </bean><property name="b" ref="b" />
  21. </bean>
  22. <bean id="b" />  <prop key="key1">Value 1</prop>
  23. <bean id="a" >
  24. <bean id="employee"  autowire="byName">
  25. <bean id="employee"  autowire="byType">
  26. <bean id="employee"  autowire="constructor">
  27.    
  28. </bean>
  29. </bean>
  30. </bean><property name="b" ref="b" />
  31. </bean>
  32. <bean id="b" />  <prop key="key2">Value 2</prop>
  33. <bean id="a" >
  34. <bean id="employee"  autowire="byName">
  35. <bean id="employee"  autowire="byType">
  36. <bean id="employee"  autowire="constructor">
  37.    
  38. </bean>
  39. </bean>
  40. </bean><property name="b" ref="b" />
  41. </bean>
  42. <bean id="b" /></props>
  43.   </property>
  44. </bean>
复制代码
以上是 Spring XML 配置文件中 Bean 注入的常用标签和集合注入的标签。
depend-on 的使用

正常情况下,举个例子:
  1. public class A {
  2. <bean id="a" >
  3. <bean id="employee"  autowire="byName">
  4. <bean id="employee"  autowire="byType">
  5. <bean id="employee"  autowire="constructor">
  6.    
  7. </bean>
  8. </bean>
  9. </bean><property name="b" ref="b" />
  10. </bean>
  11. <bean id="b" />private B b;
  12. <bean id="a" >
  13. <bean id="employee"  autowire="byName">
  14. <bean id="employee"  autowire="byType">
  15. <bean id="employee"  autowire="constructor">
  16.    
  17. </bean>
  18. </bean>
  19. </bean><property name="b" ref="b" />
  20. </bean>
  21. <bean id="b" />
  22. <bean id="a" >
  23. <bean id="employee"  autowire="byName">
  24. <bean id="employee"  autowire="byType">
  25. <bean id="employee"  autowire="constructor">
  26.    
  27. </bean>
  28. </bean>
  29. </bean><property name="b" ref="b" />
  30. </bean>
  31. <bean id="b" />// 省略 getter 和 setter
  32. }
复制代码
B 这个 Bean 被写成是 A 的属性,也就是说,A 类依赖 B 类,这种正常的依赖关系下,我们在以 XML 为配置元数据的配置文件中,可以使用 ref 属性来指定 A 的依赖项是 B。
  1. <bean id="a" >
  2. <bean id="employee"  autowire="byName">
  3. <bean id="employee"  autowire="byType">
  4. <bean id="employee"  autowire="constructor">
  5.    
  6. </bean>
  7. </bean>
  8. </bean><property name="b" ref="b" />
  9. </bean>
  10. <bean id="b" />
复制代码
这种依赖关系,是很明显的,一下子就能看出 A 是依赖 B 的,所以我们可以使用 ref 属性来指定依赖项,与此同时,这个依赖项会被注入到需要它的 Bean 中,这里就是 B 的对象被注入到 A 中作为 b 属性。
那么对于依赖关系不明显,但是又有依赖关系的时候,就可以使用 depend-on 属性。
比如有一个类 C,它是间接依赖 D 类的,也就是说 D 没有作为 C 的属性。此时,想要实例化 C,那么需要 D 先实例化好后,才能去实例化 C。
标签中的 depend-on 属性就能够做到这一点,让这种依赖关系不明显的,也能保证你在使用某个 Bean 时,该 Bean 的依赖项会先实例化。
  1. [/code]这样,在使用 C 时,是能够保证 C 的依赖项 D 是已经实例化好的。
  2. 如果有多个依赖项,那么可以使用有效的分隔符进行分割(英文逗号、英文分号或者空格):
  3. [code]
复制代码
同理,销毁对象的时候,在销毁 C 对象之前,D 就会被先销毁。
lazy-init 的使用

标签中的 lazy-init 属性是用来指定某个 Bean 是否开启懒加载的。
默认情况下,Bean 定义中这个属性默认值是 false,也就是说默认的 Bean 都不是懒加载的,当 Spring IoC 容器创建后,容器就会立即去创建并完全配置所有的单例作用域的 Bean。
如果我们想让某个 Bean 不在一开始就被实例化,那么就可以使用这个懒加载属性开启某个 Bean 的懒加载。懒加载的 Bean,只有在被第一次使用时,才会被实例化。
在以 XML 为配置元数据为例,直接使用 lazy-init 属性,设置该属性为 true 就 OK。
  1. [/code]当然,如果这个懒加载的 Bean 被其他没有懒加载的单例 Bean 给引用了,那么这个懒加载的 Bean 也会在容器创建后被容器所创建,因为容器必须确保单例 Bean 的依赖项都被实例化了。
  2. [size=5]自动注入依赖项[/size]
  3. [b]Spring 支持 Bean 之间依赖关系的自动注入。[/b] 它能根据 ApplicationContext 的内容帮我们处理 Bean 之间的依赖关系,这样我们就可以不用手动在配置元数据中指定 Bean 之间的依赖关系。
  4. [indent]网上有很多博客把「自动注入」说成「自动装配」的,在我看来,这是两回事,实际上从它们的英文名来看,就是两回事。
  5. 说到自动装配(Auto Configuration),一般都是联系到 Spring Boot 的,因为它的特点就是开箱即用,省去大量的配置,而之所以能省去大量的配置,就得益于它的自动装配。而自动注入(Autowiring Collaborator)是指自动注入协作者,换句话说,指 Bean 之间的依赖项 Spring 能帮你去注入。
  6. [/indent][size=4]自动注入的优点[/size]
  7. [list]
  8. [*]可以大大减少我们在配置元数据中进行指定属性或构造方法的参数
  9. [*]可以随着对象的发展而更新配置,比如你需要给某个类添加一个新的依赖项,那么你不需要去修改配置元数据,自动注入就帮我们处理
  10. [/list]以 XML 作为配置元数据的情况下,我们可以使用  标签中的 autowire 属性来指定自动注入的模式。
  11. [size=4]3 种自动注入的模式[/size]
  12. 默认没有自动注入,这就是最开始学习的写法,Bean 的依赖项需要用 ref 属性来指定。
  13. [list=1]
  14. [*]byName:容器会默认根据[b]属性名[/b]找到一个同名的 Bean 进行自动注入。
  15. [/list][code]<bean id="a" >
  16. <bean id="employee"  autowire="byName">
  17. <bean id="employee"  autowire="byType">
  18. <bean id="employee"  autowire="constructor">
  19.    
  20. </bean>
  21. </bean>
  22. </bean><property name="b" ref="b" />
  23. </bean>
  24. <bean id="b" />
复制代码

  • byType:容器会默认根据属性的类型找到一个同类型的 Bean 进行自动注入,如果存在多个同类型的 Bean,那么 Spring IoC 容器就不知道注入哪一个 Bean,就会抛出异常。
  1. <bean id="a" >
  2. <bean id="employee"  autowire="byName">
  3. <bean id="employee"  autowire="byType">
  4. <bean id="employee"  autowire="constructor">
  5.    
  6. </bean>
  7. </bean>
  8. </bean><property name="b" ref="b" />
  9. </bean>
  10. <bean id="b" />
复制代码

  • constructor:类似 byType,不过它是基于构造方法参数的自动注入。
  1. <bean id="a" >
  2. <bean id="employee"  autowire="byName">
  3. <bean id="employee"  autowire="byType">
  4. <bean id="employee"  autowire="constructor">
  5.    
  6. </bean>
  7. </bean>
  8. </bean><property name="b" ref="b" />
  9. </bean>
  10. <bean id="b" />
复制代码
需要注意的是,自动注入只对那些具有依赖关系的 Bean 起作用,而不是所有的 Bean。因此,在配置 Bean 的时候,需要确保被注入的属性在其他 Bean 中是存在的。
自动注入的限制和缺点


  • 在配置元数据中,使用  和  编写的明确的依赖关系会覆盖自动注入的,换句话说,它的优先级比自动注入的方式高。还有就是自动注入是不能注入简单的类型的,比如基本数据类型、String、Class 等类型(包括这些类型的数组也是不能自动注入的)。这里的限制是设计上的限制。
  • 自动注入是单靠 Spring 帮我们注入的,精确度不如我们手动去明确设置 Bean 之间的依赖关系的,某些情况下可能由于我们的疏忽会注入错误的 Bean 导致意想不到的结果。
  • 自动注入的信息对于一些用来生成文档的工具可能是没用的。
  • 自动注入的时候找到了多个匹配上的 Bean,对于数组和集合来说是正常的,没什么问题,但是如果要注入的 Bean 是单值属性的依赖关系,那么 Spring IoC 就不知道该注入哪一个 Bean,就会抛出异常。这个就在上面的 byType 中说过的。
对于自动注入匹配到了多个 Bean,有以下解决方案:

  • 不用自动注入,改为明确手动注入
  • 使用  中的  primary 属性,设置为 true,那么在多个同类型的 Bean 定义当中,如果匹配上了,那么这个 Bean 就是主要的候选者,就会注入这个 Bean。
  • 使用基于注解的自动注入(@Autowired、@Primary 等)
这几个使用注解实现自动注入的,在后面的文章中再讲。
总结

我们总结一下,关于 Spring 中 Bean 的配置与依赖注入的重要内容。

  • Bean 的配置元数据可通过 XML 文件进行定义和配置,当然后续我们会介绍使用注解和 Java 配置作为配置元数据的方式。
  • 基本标签包括 property、constructor-arg、list、set、map 和 props,用于注入属性值或集合类型的属性。
  • depend-on 属性用于指定 Bean 之间的依赖关系,确保指定的 Bean 先于当前 Bean 实例化,这种依赖不是显式的依赖。
  • lazy-init 属性用于指定 Bean 是否懒加载,默认为 false,即容器启动时立即实例化所有单例 Bean。
  • 自动注入可减少配置元数据中的显式指定依赖项,提供 autowire 属性以设置自动注入的模式。
  • 自动注入模式包括 byName、byType 和 constructor,通过属性名或类型进行自动匹配完成依赖注入。
  • 自动注入存在一定的限制和缺点,需注意配置的精确性和冲突解决。
  • 对于多个匹配的自动注入,可通过手动注入、primary 属性或基于注解的自动注入来解决。
以上就是本篇所有的内容了,对屏幕前的你有帮助的话,麻烦点点关注,点个免费的赞,给予我支持与鼓励,感兴趣的话可以关注我这个专栏,谢谢你们!
最后的最后

希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
咱们下期再见!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表