Spring3.2.2_自动装配




Spring_Autowiring collaborators

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

   <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

案例分析:

、创建CumputerBean类


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 类



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


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)



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. //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中属性的名称 自动装配)



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. //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>






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



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. //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类 修改后代码如下:


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. }





配置文件操作:



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. >  
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时

 

  



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. >  
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>





会出现如下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、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:



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. >  
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、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:



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. >  
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一致):





1. org.springframework.beans.factory.UnsatisfiedDependencyException:   
2.   
3. Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]:



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:



    1. expected single matching bean but found 2: deptBean1,deptBean2  
    2.


    Spring_Autowiring collaborators

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

       <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

    案例分析:

    、创建CumputerBean类


    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 类


    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



    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)



    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. //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中属性的名称 自动装配)


    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. //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>



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


    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. //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类 修改后代码如下:


    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. }






    配置文件操作:


    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. >  
    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时

     

      



    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. >  
    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>





    会出现如下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、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:



    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. >  
    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、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:



      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. >  
      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一致):

      1. org.springframework.beans.factory.UnsatisfiedDependencyException:   
      2.   
      3. Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]:


      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:




      1. expected single matching bean but found 2: deptBean1,deptBean2