Spring的自动装配Bean

spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、<constructor-arg>)。IOC容器会自动建立javabean之间的关联关系。

如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:以下代码就是手动装配:

?
1
2
3
4
5
6
7
8
9
10
  
   < bean id = "customerDAO" class = "com.hebeu.customer.dao.JdbcCustomerDAO" >
     < property name = "dataSource" ref = "dataSource" />
   </ bean >
  
</ beans >

通过<property name="dataSource" ref="dataSource" />向customerDAO的bean中注入了dataSource

在Spring框架,可以用 auto-wiring 功能会自动装配Bean。要启用它,只需要在 <bean>定义“autowire”属性。

?
1
< bean id = "customer" class = "com.yiibai.common.Customer" autowire = "byName" />

在Spring中,支持 5 自动装配模式。

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
  • constructor – 在构造函数参数的byType方式。

第一种自动装配【根据属性名称自动装配】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.hebeu.model;
  
public class Customer {
  
   private Address address;
    
   public Customer() {
      
   }
    
   public Customer( int id, Address address) {
     super ();
     this .address = address;
   }
  
   public Address getAddress() {
     return address;
   }
  
   public void setAddress(Address address) {
     this .address = address;
   }
    
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.hebeu.model;
  
public class Address {
  
   private String fulladdress;
    
   public Address(){
      
   }
    
   public Address(String addr){
     this .fulladdress = addr;
   }
  
   public String getFulladdress() {
     return fulladdress;
   }
  
   public void setFulladdress(String fulladdress) {
     this .fulladdress = fulladdress;
   }
    
}
?
1
2
3
4
5
6
7
8
9
10
11
12
    
   < bean id = "customer" class = "com.hebeu.model.Customer" autowire = "byName" ></ bean >
    
   < bean id = "address" class = "com.hebeu.model.Address" >
     < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property >
   </ bean >
    
</ beans >

这样就将address注入到Customer中。这就是自动注入ByName.在Customer bean中公开了一个属性address,Spring容器会找到address bean,并且装配。这里必须要注意,Customer中要被注入的bean的set方法要求必须是public的,否则会报空指针异常。还有配置的bean的id必须和Customer中声明的变量名相同。

第二种自动装配【根据数据类型自动装配】

声明的俩个bean同样为Customer以及Address,将applicationContext.xml转换为这样的就是实现根据数据类型进行自动装配。

?
1
2
3
4
5
6
7
8
9
10
11
    
   < bean id = "customer" class = "com.hebeu.model.Customer" <strong>< span style = "color:#FF0000;" >autowire="byType"</ span ></ strong >></ bean >
    
   < bean id = "bean1" class = "com.hebeu.model.Address" >
     < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property >
   </ bean >
</ beans

类型自动装配的意思是如果一个bean的数据类型与其他的bean属性的数据类型相同,将会自动兼容装配它。当然要求只能配置一个某一个类型的bean.如果配置成这样,那么是会出错的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    
   < bean id = "customer" class = "com.hebeu.model.Customer" autowire = "byType" ></ bean >
    
   < bean id = "bean1" class = "com.hebeu.model.Address" >
     < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property >
   </ bean >
   < bean id = "bean2" class = "com.hebeu.model.Address" >
     < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property >
   </ bean >
</ beans >

第三种自动装配【根据构造方法自动装配】

案例同上,将applicationContext.xml转换为如下,就实现了按照构造方法自动装配:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    
   < bean id = "customer" class = "com.hebeu.model.Customer" >
     <!-- 构造方法的参数 -->
     < constructor-arg >
       < ref bean = "bean1" />
     </ constructor-arg >
   </ bean >
    
   < bean id = "bean1" class = "com.hebeu.model.Address" >
     < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property >
   </ bean >
    
</ beans >

 它实际上是构造函数的参数类型自动装配。这意味着如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么就自动装配。

转载:https://www.jb51.net/article/106856.htm

猜你喜欢

转载自www.cnblogs.com/xiaolovewei/p/9424804.html