自动装配

【XML配置里的Bean自动装配】

1.Spring IOC容器可以自动装配Bean。需要做的就是仅仅在<bean>的autowire属性里指定自动装配的模式

--byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean。在这种情况下,Spring将无法判断哪个Bean最合适该属性,所以不能执行自动装配。

--byName(根据名称自动装配):必须将目标Bean的名称和属性名设置的完全相同。

--constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用

(1)当使用p标签配置时:

配置文件代码:

 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     xmlns:p="http://www.springframework.org/schema/p"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd">
 7 
 8   <bean id="address" class="com.hk.beans.autowire.Address"
 9         p:city="Beijing" p:street="GuoMao"></bean>
10         
11   <bean id="car" class="com.hk.beans.autowire.Car"
12         p:brand="Audi" p:price="300000"></bean>
13  
14   <bean id="person" class="com.hk.beans.autowire.Person"
15         p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
16 
17 </beans>

运行结果:

1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

(2)当用自动装配时:

(i)byName方式:根据bean的名字和当前bean的setter风格的属性名进行自动装配。若有匹配的,则进行自动装配,没有匹配的则不装配。

配置文件代码:

运行结果:

1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

注意:在配置文件中配置bean时,id属性的值必须和javabean代码的变量名相同。

否则:

配置文件中:

运行结果:

(ii)byType方式:根据bean的类型和当前bean的属性的类型进行自动装配。

配置文件代码:

1   <bean id="person" class="com.hk.beans.autowire.Person"
2         p:name="Tom" autowire="byType"></bean>

运行结果:

1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

注:但是,当配置文件中由两个及以上的相同类型的bean时,会发生错误。

如:

配置文件中有:

1   <bean id="address" class="com.hk.beans.autowire.Address"
2         p:city="Beijing" p:street="GuoMao"></bean>
3 
4   <bean id="address2" class="com.hk.beans.autowire.Address"
5         p:city="Shanghai" p:street="Songjianglu"></bean>

运行时会出现以下错误:

 No qualifying bean of type [com.hk.beans.autowire.Address] is defined: expected single matching bean but found 2: address,address2

【自动装配的缺点】

1.在Bean配置文件里设置autowire属性进行自动装配将会配置Bean的所有属性。然而,若只希望装配个别属性时,autowire属性就不够灵活了。

2.autowire属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之。

3.一般情况下,在实际项目中很少使用自动装配因为和自动装配所带来的好处相比,明确清晰的配置文档更有说服力。

【附录】

Address.java:

 1 package com.hk.beans.autowire;
 2 
 3 public class Address {
 4     private String city;
 5     private String street;
 6     
 7     public String getCity() {
 8         return city;
 9     }
10     public void setCity(String city) {
11         this.city = city;
12     }
13     public String getStreet() {
14         return street;
15     }
16     public void setStreet(String street) {
17         this.street = street;
18     }
19     @Override
20     public String toString() {
21         return "Address [city=" + city + ", street=" + street + "]";
22     }
23 }

Car.java:

 1 package com.hk.beans.autowire;
 2 
 3 public class Car {
 4     private String brand;
 5     private double price;
 6     
 7     public String getBrand() {
 8         return brand;
 9     }
10     public void setBrand(String brand) {
11         this.brand = brand;
12     }
13     public double getPrice() {
14         return price;
15     }
16     public void setPrice(double price) {
17         this.price = price;
18     }
19     @Override
20     public String toString() {
21         return "Car [brand=" + brand + ", price=" + price + "]";
22     }
23 }

Person.java:

 1 package com.hk.beans.autowire;
 2 
 3 public class Person {
 4     private String name;
 5     private  Address address;
 6     private Car car;
 7     
 8     public String getName() {
 9         return name;
10     }
11     public void setName(String name) {
12         this.name = name;
13     }
14     public Address getAddress() {
15         return address;
16     }
17     public void setAddress(Address address) {
18         this.address = address;
19     }
20     public Car getCar() {
21         return car;
22     }
23     public void setCar(Car car) {
24         this.car = car;
25     }
26     @Override
27     public String toString() {
28         return "Person [name=" + name + ", address=" + address + ", car=" + car
29                 + "]";
30     }
31 }
每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
原文地址:https://www.cnblogs.com/zhzcode/p/9603540.html