首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring3.2.2_自动安装

2013-08-16 
Spring3.2.2_自动装配分类:?Spring课程总结2013-04-25 16:33?157人阅读?评论(0)?收藏?举报Spring_Autowiri

Spring3.2.2_自动装配

分类:?Spring课程总结2013-04-25 16:33?157人阅读?评论(0)?收藏?举报

Spring_Autowiring?collaborators

在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配)、byName,byType,constructor下面来分别介绍一下这些是如何自动装配的

???<bean?id="foo"?style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; background-color: #e7e5dc; width: 693px; overflow: auto; padding-top: 1px; color: #362e2b; margin: 18px 0px !important;">[java]?view plaincopy?

  1. package?www.csdn.spring.autowire.bean;??
  2. ??
  3. public?class?CumputerBean?{??
  4. ??
  5. //?电脑名称??
  6. ??
  7. private?String?name;??
  8. ??
  9. public?void?setName(String?name)?{??
  10. ??
  11. this.name?=?name;??
  12. ??
  13. }??
  14. ??
  15. }??

2、创建DeptBean?类

[java]?view plaincopy?
  1. package?www.csdn.spring.autowire.bean;??
  2. ??
  3. ??
  4. public?class?DeptBean?{??
  5. ??
  6. //部门名称??
  7. ??
  8. private?String?name;??
  9. ??
  10. public?void?setName(String?name)?{??
  11. ??
  12. this.name?=?name;??
  13. ??
  14. }??
  15. ??
  16. }??

3、创建EmployeeBean

[java]?view plaincopy?
  1. package?www.csdn.spring.autowire.bean;??
  2. ??
  3. ??
  4. public?class?EmployeeBean?{??
  5. ??
  6. private?DeptBean?deptBean;??
  7. ??
  8. private?CumputerBean?cumputerBean;??
  9. ??
  10. ??
  11. public?void?setDeptBean(DeptBean?deptBean)?{??
  12. ??
  13. this.deptBean?=?deptBean;??
  14. ??
  15. }??
  16. ??
  17. public?void?setCumputerBean(CumputerBean?cumputerBean)?{??
  18. ??
  19. this.cumputerBean?=?cumputerBean;??
  20. ??
  21. }??
  22. ??
  23. @Override??
  24. ??
  25. public?String?toString()?{??
  26. ??
  27. return?"EmployeeBean?[deptBean="?+?deptBean?+?",?cumputerBean="??
  28. ??
  29. +?cumputerBean?+?"]";??
  30. ??
  31. }??
  32. ??
  33. ??
  34. }??

首先分析no、byName、byType的配置都是采用setter方法依赖注入实现的案例

1、no配置(通过ref=””引用需要的bean)

[java]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  6. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  7. ??
  8. <!--?电脑bean?-->??
  9. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  10. <property?name="name"?value="HP6325笔记本"?/>??
  11. </bean>??
  12. ??
  13. <!--?部门bean?-->??
  14. <bean?id="deptBean"?class="www.csdn.spring.autowire.bean.DeptBean">??
  15. <property?name="name"?value="CSDN教育事业部"?/>??
  16. </bean>??
  17. ??
  18. <!--?员工bean??根据EmployeeBean中的属性名称通过ref="bean"去匹配-->??
  19. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean">??
  20. <property?name="cumputerBean"?ref="cumputerBean"?/>??
  21. <property?name="deptBean"?ref="deptBean"?/>??
  22. ??
  23. </bean>??
  24. ??
  25. </beans>??

2、byName配置(分析:会根据EmployeeBean中属性的名称?自动装配)

[java]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. ??
  12. ??
  13. <!--?电脑bean?-->??
  14. ??
  15. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  16. ??
  17. <property?name="name"?value="HP6325笔记本"?/>??
  18. ??
  19. </bean>??
  20. ??
  21. <!--?部门bean?-->??
  22. ??
  23. <bean?id="deptBean"?class="www.csdn.spring.autowire.bean.DeptBean">??
  24. ??
  25. <property?name="name"?value="CSDN教育事业部"?/>??
  26. ??
  27. </bean>??
  28. ??
  29. <!--?员工bean-->??
  30. ??
  31. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"?autowire="byName"/>??
  32. ??
  33. </beans>??
[java]?view plaincopy?
  1. ???

3、byType配置(分析:会根据EmployeeBean中属性的类型?自动装配)

[java]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. <!--?电脑bean?-->??
  12. ??
  13. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  14. ??
  15. <property?name="name"?value="HP6325笔记本"?/>??
  16. ??
  17. </bean>??
  18. ??
  19. <!--?部门bean?-->??
  20. ??
  21. <bean?id="deptBean"?class="www.csdn.spring.autowire.bean.DeptBean">??
  22. ??
  23. <property?name="name"?value="CSDN教育事业部"?/>??
  24. ??
  25. </bean>??
  26. ??
  27. <!--?员工bean??根据EmployeeBean中的属性根据类型匹配-->??
  28. ??
  29. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"?autowire="byType"/>??
  30. ??
  31. ??
  32. </beans>??

注意:当根据byType类型装配时,当在容器内找到多个匹配的类型时会出现如下bug

org.springframework.beans.factory.UnsatisfiedDependencyException:?

Error?creating?bean?with?name?'employeeBean'?defined?in?class?path?resource?[spring-byType.xml]:?Unsatisfied?dependency?expressed?through?bean?property?'deptBean':?:

?No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?is?defined:?expected?single?matching?bean?but?found?2:?deptBean,deptBean1;?

nested?exception?is?org.springframework.beans.factory.NoUniqueBeanDefinitionException:?

No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?is?defined:?expected?single?matching?bean?but?found?2:?deptBean,deptBean1

?

4、Constructor(构造器参数根据byType类型匹配,自动装配)

首先修改EmployeeBean类?修改后代码如下:

[java]?view plaincopy?
  1. package?www.csdn.spring.autowire.bean;??
  2. ??
  3. ??
  4. public?class?EmployeeBean?{??
  5. ??
  6. private?DeptBean?deptBean;??
  7. private?CumputerBean?cumputerBean;??
  8. ??
  9. ??
  10. public?EmployeeBean(DeptBean?deptBean,?CumputerBean?cumputerBean)?{??
  11. super();??
  12. this.deptBean?=?deptBean;??
  13. this.cumputerBean?=?cumputerBean;??
  14. }??
  15. ??
  16. @Override??
  17. public?String?toString()?{??
  18. return?"EmployeeBean?[deptBean="?+?deptBean?+?",?cumputerBean="??
  19. +?cumputerBean?+?"]";??
  20. }??
  21. }??
[java]?view plaincopy?
  1. ???

配置文件操作:

[html]?view plaincopy?
  1. ??<?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. <!--?电脑bean?-->??
  12. ??
  13. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  14. <property?name="name"?value="HP6325笔记本"?/>??
  15. </bean>??
  16. ??
  17. <!--?部门bean?-->??
  18. ??
  19. <bean?id="deptBean"?class="www.csdn.spring.autowire.bean.DeptBean">??
  20. <property?name="name"?value="CSDN教育事业部"?/>??
  21. </bean>??
  22. ??
  23. <!--?员工bean?根据EmployeeBean中的?属性名称?bytype?去匹配?-->??
  24. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"??
  25. autowire="constructor">??
  26. </bean>??
  27. ??
  28. </beans>??

说明:

1、当构造器的参数类型在容器中找不全时。

?比如:

???配置文件中只配置了CumpterBean时

?

??

[html]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. <!--?电脑bean?-->??
  12. ??
  13. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  14. ??
  15. <property?name="name"?value="HP6325笔记本"?/>??
  16. ??
  17. </bean>??
  18. ??
  19. <!--?员工bean?根据EmployeeBean中的?属性名称?bytype?去匹配?-->??
  20. ??
  21. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"??
  22. ??
  23. autowire="constructor">??
  24. ??
  25. </bean>??
  26. ??
  27. </beans>??
[html]?view plaincopy?
  1. ???

会出现如下bug:

org.springframework.beans.factory.UnsatisfiedDependencyException:

?Error?creating?bean?with?name?'employeeBean'?defined?in?class?path?resource?[spring-constructors.xml]:?Unsatisfied?dependency?expressed?through?constructor?argument?with?index?0?of?type?[www.csdn.spring.autowire.bean.DeptBean]:?:?

No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?found?for?dependency:

?expected?at?least?1?bean?which?qualifies?as?autowire?candidate?for?this?dependency.?Dependency?annotations:?{};?

nested?exception?is?org.springframework.beans.factory.NoSuchBeanDefinitionException:

?No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?found?for?dependency:?

expected?at?least?1?bean?which?qualifies?as?autowire?candidate?for?this?dependency.?Dependency?annotations:?{}

Caused?by:?

org.springframework.beans.factory.NoSuchBeanDefinitionException:

?No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?found?for?dependency:?

expected?at?least?1?bean?which?qualifies?as?autowire?candidate?for?this?dependency.?Dependency?annotations:?{}

2、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:

[html]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. <!--?电脑bean?-->??
  12. ??
  13. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  14. ??
  15. <property?name="name"?value="HP6325笔记本"?/>??
  16. ??
  17. </bean>??
  18. ??
  19. <!--?部门bean?-->??
  20. ??
  21. <bean?id="deptBean"?class="www.csdn.spring.autowire.bean.DeptBean">??
  22. ??
  23. <property?name="name"?value="CSDN教育事业部"?/>??
  24. ??
  25. </bean>??
  26. ??
  27. <!--?部门bean?-->??
  28. ??
  29. <bean?id="deptBean1"?class="www.csdn.spring.autowire.bean.DeptBean">??
  30. ??
  31. <property?name="name"?value="CSDN教育事业部"?/>??
  32. ??
  33. </bean>??
  34. ??
  35. ??
  36. <!--?员工bean?根据EmployeeBean中的?属性名称?bytype?去匹配?-->??
  37. ??
  38. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"??
  39. ??
  40. autowire="constructor">??
  41. ??
  42. </bean>??
  43. ??
  44. </beans>??

?

说明:上面配置有两个同样类型的DeptBean但是不会出现bug,原因是在EmployeeBean中构造器接受的参数名称与deptBean一致。

3、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:

[html]?view plaincopy?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. ??
  3. <beans?xmlns="http://www.springframework.org/schema/beans"??
  4. ??
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  6. ??
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans??
  8. ??
  9. ???????????http://www.springframework.org/schema/beans/spring-beans.xsd">??
  10. ??
  11. <!--?电脑bean?-->??
  12. ??
  13. <bean?id="cumputerBean"?class="www.csdn.spring.autowire.bean.CumputerBean">??
  14. ??
  15. <property?name="name"?value="HP6325笔记本"?/>??
  16. ??
  17. </bean>??
  18. ??
  19. <!--?部门bean?-->??
  20. ??
  21. <bean?id="deptBean1"?class="www.csdn.spring.autowire.bean.DeptBean">??
  22. ??
  23. <property?name="name"?value="CSDN教育事业部"?/>??
  24. ??
  25. </bean>??
  26. ??
  27. <!--?部门bean?-->??
  28. ??
  29. <bean?id="deptBean2"?class="www.csdn.spring.autowire.bean.DeptBean">??
  30. ??
  31. <property?name="name"?value="CSDN教育事业部"?/>??
  32. ??
  33. </bean>??
  34. ??
  35. <!--?员工bean?根据EmployeeBean中的?属性名称?bytype?去匹配?-->??
  36. ??
  37. <bean?id="employeeBean"?class="www.csdn.spring.autowire.bean.EmployeeBean"??
  38. ??
  39. autowire="constructor">??
  40. ??
  41. </bean>??
  42. ??
  43. </beans>??

会出现如下bug(与byType的bug一致):

[java]?view plaincopy?
  1. org.springframework.beans.factory.UnsatisfiedDependencyException:???
  2. ??
  3. Error?creating?bean?with?name?'employeeBean'?defined?in?class?path?resource?[spring-constructors.xml]:??
[java]?view plaincopy?
  1. Unsatisfied?dependency?expressed?through?constructor?argument?with?index?0?of?type?[www.csdn.spring.autowire.bean.DeptBean]:?:???
  2. ??
  3. No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?is?defined:???
  4. ??
  5. expected?single?matching?bean?but?found?2:?deptBean1,deptBean2;???
  6. ??
  7. nested?exception?is?org.springframework.beans.factory.NoUniqueBeanDefinitionException:??
  8. ??
  9. ?No?qualifying?bean?of?type?[www.csdn.spring.autowire.bean.DeptBean]?is?defined:???
[java]?view plaincopy?
  1. expected?single?matching?bean?but?found?2:?deptBean1,deptBean2??

热点排行