Spring auto wire(自动装配) 的 五种方式

来源:互联网 发布:mac五笔输入法哪个好 编辑:程序博客网 时间:2024/05/22 11:37

Spring  auto-wire的 五种方式:

1:no   默认的方式是不进行自动装配,通过手工设置ref 属性来进行装配bean
2:byName   通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。
3:byType   通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配
4:construct   构造方法中的参数通过byType的形式,自动装配。
5:autodetect   如果有默认的构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。用于spring2.5 ,spring3.0测试不通过,估计是废弃了。

一: auto-wire  : no(默认方式)

首先定义测试需要的类:
[java] view plaincopy
  1. package com.myapp.core.autowire;  
  2.   
  3. public class Book {  
  4.    public  String  toString(){  
  5.        return   "I'm  a book, read  me......";  
  6.    }  

[java] view plaincopy
  1. package com.myapp.core.autowire;  
  2.   
  3. public class Person {  
  4.     
  5.     private  Book book;  
  6.       
  7.     public  Person(Book book){  
  8.         this.book= book;  
  9.     }  
  10.       
  11.     public void  setBook(Book book){  
  12.         this.book = book;  
  13.     }  
  14.       
  15.     public  String  toString(){  
  16.         return  "I'm  a person  I want  to  read  a book   "+ book;  
  17.     }  
  18.       
  19.     public Person(){  
  20.           
  21.     }  
  22. }  

默认方式配置:
[html] view plaincopy
  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-3.0.xsd">  
  6.   
  7.   <!-- more bean definitions for data access objects go here -->  
  8.     
  9.   <bean id="person" class="com.myapp.core.autowire.Person">  
  10.    <property name="book" ref="book" />  
  11.   </bean>  
  12.     
  13.   <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  
  14.     
  15. </beans>  
编写测试类:
[java] view plaincopy
  1. package com.myapp.core.autowire;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainTest {  
  7.       
  8.      public static void main(String[] args) {  
  9.           
  10.          ApplicationContext  context  = new ClassPathXmlApplicationContext("resource/autowire.xml");  
  11.            
  12.          Person   person =  (Person)context.getBean("person");  
  13.            
  14.           System.out.println(person.toString());  
  15.     }  
  16.     
  17. }  

测试结果:
I'm  a person  I want  to  read  a book   I'm  a book, read  me......

二:通过byName 自动装配:

修改配置文件如下:
在这个例子中通过bean的属性名自动装配;因为这个person bean的属性 book和配置文件中id为book的名字相同,所以Spring将通过setBook(Book book)自动装配。
[html] view plaincopy
  1. <!-- byName -->  
  2.    
  3.  <bean id="person" class="com.myapp.core.autowire.Person" autowire="byName">  
  4.    
  5.  </bean>  
  6.    
  7.  <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  

运行测试类:依然得到如上测试结果。

三:通过byType自动装配:

在这个例子中通过bean的属性名的类型进行自动装配;因为 person bean属性 book的类型和配置文件中id为book的类型相同,。所以spring通过setBook(Book  book)自动装配。
修改配置文件如下;
[html] view plaincopy
  1. <!-- byType -->  
  2.   
  3. <bean id="person" class="com.myapp.core.autowire.Person"  autowire="byType"/>  
  4. <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  

四:通过construct自动装配:

通过构造方法的参数的数据类型进行自动装配,在这个例子中因为person的构造方法参数是Book类型,和配置文件中的id为book的类型相同,所以spring通过Person(Book book)构造方法进行自动装配。
修改配置文件如下:
[html] view plaincopy
  1. <!-- construct -->  
  2.   
  3.  <bean id="person" class="com.myapp.core.autowire.Person"  autowire="constructor"/>  
  4.   
  5. <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  

五:通过 autodetect 自动装配:

Spring 3.0配置的xml不能用于autodetect,spring3.0应该是去掉了这个功能,改用spring2.5配置可以顺利通过测试,

首先使用construct的自动装配形式进行装配,如果没有construct就通过 byType的形式进行自动装配。
[html] view plaincopy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  4. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

[html] view plaincopy
  1.  <bean id="person" class="com.myapp.core.autowire.Person"   autowire="autodetect" />  
  2.   <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  
  3.     
  4. </beans>  
测试结果:
I'm  a person  I want  to  read  a book   I'm  a book, read  me......

总结:
自动装配不容易看出bean之间的引用关系,增加了阅读的复杂度,一般还是采用默认的方式手工进行配置,或者采用annotation的方式进行配置。


附加: 总的配置,一步步放开进行测试:
[html] view plaincopy
  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-3.0.xsd"> -->  
  6.   
  7. <beans xmlns="http://www.springframework.org/schema/beans"  
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  10. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  11.   <!-- more bean definitions for data access objects go here -->  
  12.   <!-- no -->  
  13.  <!--  <bean id="person" class="com.myapp.core.autowire.Person">  
  14.    <property name="book" ref="book" />  
  15.   </bean> -->  
  16.     
  17.   <!-- byName -->  
  18.     
  19.  <!--  <bean id="person" class="com.myapp.core.autowire.Person" autowire="byName">  
  20.     
  21.   </bean>  
  22.    -->  
  23.   <!-- byType -->  
  24.     
  25.  <!--  <bean id="person" class="com.myapp.core.autowire.Person"  autowire="byType"/> -->  
  26.     
  27.   <!-- construct -->  
  28.     
  29.   <!--  <bean id="person" class="com.myapp.core.autowire.Person"  autowire="constructor"/> -->  
  30.     
  31.   <!-- autodetect -->  
  32.     
  33.   <bean id="person" class="com.myapp.core.autowire.Person"   autowire="autodetect" />  
  34.   <bean  id="book" class="com.myapp.core.autowire.Book"></bean>  
  35.     
  36. </beans>  


2 0
原创粉丝点击