spring入门(8)--装配Bean之自动装配

Spring_Autowiring collaborators

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

   <bean id="foo" class="...Foo" autowire="autowire type">

Mode            Explanation

no: (Default) No autowiring. Bean references must be defined via a ref element. 

Changing the default setting is not recommended for larger deployments,

 because specifying collaborators explicitly gives greater control and clarity. 

To some extent, it documents the structure of a system.

 

byName:Autowiring by property name. 

Spring looks for a bean with the same name as the property that needs to be autowired. 

For example, if a bean definition is set to autowire by name, 

and it contains a master property (that is, it has a setMaster(..) method),

 Spring looks for a bean definition named master, and uses it to set the property.

 

byType:Allows a property to be autowired if exactly one bean of the property type exists in the container.

 If more than one exists, a fatal exception is thrown, 

which indicates that you may not use byType autowiring for that bean.

 If there are no matching beans, nothing happens; the property is not set.

 

constructor:Analogous to byType, but applies to constructor arguments.

 If there is not exactly one bean of the constructor argument type in the container, a fatal error is raised

案例分析:

  1、创建CumputerBean

[java] view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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. }  

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

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

[java] view plain copy print ?
  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中的 属性名称  去匹配-->  
  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 plain copy print ?
  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 plain copy print ?
  1.    

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

[java] view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  1.    

配置文件操作:

[html] view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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(与byTypebug一致):

[java] view plain copy print ?
  1. org.springframework.beans.factory.UnsatisfiedDependencyException:   
  2.   
  3. Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]:  
[java] view plain copy print ?
  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 plain copy print ?
  1. expected single matching bean but found 2: deptBean1,deptBean2  

你可能感兴趣的:(spring入门(8)--装配Bean之自动装配)