Spring4自动装配(default-autowire)

§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.         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");  
  4.         Employee employee=(Employee)ac.getBean("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.         ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");  
  5.         Employee employee=(Employee)ac.getBean("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>  

 
    1. 自动装配 constructor 需要写单参构造方法  

转载自:

猜你喜欢

转载自www.cnblogs.com/PengChengLi/p/10516939.html