§1 什么是自动装配?
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。
简而言之,就是对于bean当中引用的其他bean不需要我们自己去配置它改使用哪个类,Spring 的自动装配可以帮助我们完成这些工作。
§2 自动装配的意义?
引用
理解自动装配的优缺点是很重要的。其中优点包括:
自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。
自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
§3 自动装配有几种类型?
5种模式 说明
通过配置default-autowire 属性,Spring IOC 容器可以自动为程序注入bean;默认是no,不启用自动装配;
default-autowire 的类型有byName,byType,constructor;
byName:通过名称进行自动匹配;
byType:根据类型进行自动匹配;
constructor:和byType 类似,只不过它是根据构造方法注入而言的,根据类型,自动注入;
byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自
动装配。例如,在bean定义中将 autowire设置为by name,而该bean包含master属性(同时提供
setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的
bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,
则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置
dependency-check="objects"让Spring抛出异常。
constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类
型一致的bean,那么将会抛出异常。
autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。
如果发现默认的构造器,那么将使用byType方式。
建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误;
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://www.springframework.org/schema/beans
5. http://www.springframework.org/schema/beans/spring-beans.xsd"
6. default-autowire="byName">
7. <bean id="car2" class="com.zhiqi.model.Car">
8. <property name="id" value="2007"></property>
9. <property name="carName" value="奥迪"></property>
10. </bean>
11. <!-- 自动装配 byName 来找car -->
12. <bean id="car" class="com.zhiqi.model.Car">
13. <property name="id" value="2009"></property>
14. <property name="carName" value="奥拓"></property>
15. </bean>
16.
17. <bean id="employee" class="com.zhiqi.model.Employee">
18. <property name="id" value="10080"></property>
19. <property name="name" value="贾经理"></property>
20. <property name="sex" value="男"></property>
21.
22. </bean>
23.
24. </beans>
1. public class Car {
2.
3.
4. private int id;
5. private String carName;
6. public int getId() {
7. return id;
8. }
9. public void setId(int id) {
10. this.id = id;
11. }
12. public String getCarName() {
13. return carName;
14. }
15. public void setCarName(String carName) {
16. this.carName = carName;
17. }
18. }
1. public class Employee {
2.
3.
4. private int id;
5. private String name;
6. private String sex;
7. private Car car;
8.
9.
10. public Employee() {
11. super();
12. // TODO Auto-generated constructor stub
13. }
14. public Employee(int id, String name, String sex) {
15. super();
16. this.id = id;
17. this.name = name;
18. this.sex = sex;
19. }
20.
21.
22. public int getId() {
23. return id;
24. }
25. public void setId(int id) {
26. this.id = id;
27. }
28. public String getName() {
29. return name;
30. }
31. public void setName(String name) {
32. this.name = name;
33. }
34. public String getSex() {
35. return sex;
36. }
37. public void setSex(String sex) {
38. this.sex = sex;
39. }
40. public Car getCar() {
41. return car;
42. }
43. public void setCar(Car car) {
44. this.car = car;
45. }
46. }
public class MyTest {
1.
2. public static void main(String[] args) {
3. new ClassPathXmlApplicationContext("beans.xml");
4. "employee");
5. //employee.setName("李经理");//在xml中属性注入
6. System.out.println(employee.getCar().getCarName());
7.
8.
9. }
10. }
【byType】
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://www.springframework.org/schema/beans
5. http://www.springframework.org/schema/beans/spring-beans.xsd"
6. default-autowire="byType">
7.
8. <!-- 自动装配 byType 有两个相同类型会报错 -->
9. <bean id="car2" class="com.zhiqi.model.Car">
10. <property name="id" value="2007"></property>
11. <property name="carName" value="奥迪"></property>
12. </bean>
13. <!-- 自动装配 byType 来找car -->
14. <bean id="car" class="com.zhiqi.model.Car">
15. <property name="id" value="2009"></property>
16. <property name="carName" value="奥拓"></property>
17. </bean>
18.
19. <bean id="employee" class="com.zhiqi.model.Employee">
20. <property name="id" value="10080"></property>
21. <property name="name" value="贾经理"></property>
22. <property name="sex" value="男"></property>
23.
24. </bean>
25.
26. </beans>
测试:
1. public class MyTest {
2.
3. public static void main(String[] args) {
4. new ClassPathXmlApplicationContext("beans.xml");
5. "employee");
6. //employee.setName("李经理");//在xml中属性注入
7. System.out.println(employee.getCar().getCarName());
8.
9. }
10. }
运行:
【default-autowire="constructor"】
1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://www.springframework.org/schema/beans
5. http://www.springframework.org/schema/beans/spring-beans.xsd"
6. default-autowire="constructor">
7.
8. <!-- 自动装配 constructor 需要写单参构造方法 -->
9. <bean id="car3" class="com.zhiqi.model.Car">
10. <property name="id" value="2007"></property>
11. <property name="carName" value="奥迪"></property>
12. </bean>
13.
14.
15. <bean id="employee" class="com.zhiqi.model.Employee">
16. <property name="id" value="10080"></property>
17. <property name="name" value="贾经理"></property>
18. <property name="sex" value="男"></property>
19.
20. </bean>
21.
22. </beans>
- 自动装配 constructor 需要写单参构造方法