【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 }