XML 配置里的 Bean 自动装配
Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式
byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用
动起手来,新建一个包com.jay。
新建4个类,分别是Main.java、Person.java、Car.java、Address.java。同时在src文件夹下新建一个beans-autowire.xml(名字自己取)文件。
beans-autowire.xml:
1 2 3 4 5 6 7 8 
  | <bean id="address" class="com.jay.Address" p:city="nanjing" p:street="应天大街"></bean>   <bean id="address2" class="com.jay.Address" p:city="yangzhou" p:street="扬子江"></bean>   <bean id="car" class="com.jay.Car" p:price="1800000" p:brand="玛莎拉蒂"></bean>   <!-- 可以使用 autowire 属性指定自动装配的方式,   	   byName 根据 bean 的名字和当前 bean 的 setter 风格的属性名进行自动装配。若有匹配的则自动装配,若没有匹配的则不装配   	   byType 根据 bean 的类型和当前 bean 的属性的类型进行自动装配。若 IOC 容器中有1个以上的类型匹配的 bean,则抛异常   -->   <bean id="person" class="com.jay.Person" p:name="jay" autowire="byName"></bean> 
  | 
Address.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
  | package com.jay; public class Address { 	private String city; 	private String street; 	 	public String getCity() { 		return city; 	} 	public void setCity(String city) { 		this.city = city; 	} 	public String getStreet() { 		return street; 	} 	public void setStreet(String street) { 		this.street = street; 	} 	@Override 	public String toString() { 		return "Address [city=" + city + ", street=" + street + "]"; 	} } 
  | 
Car.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
  | package com.jay; public class Car { 	private String brand; 	private double price; 	 	public String getBrand() { 		return brand; 	} 	public void setBrand(String brand) { 		this.brand = brand; 	} 	public double getPrice() { 		return price; 	} 	public void setPrice(double price) { 		this.price = price; 	} 	@Override 	public String toString() { 		return "Car [brand=" + brand + ", price=" + price + "]"; 	} } 
  | 
Person.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
  | package com.jay; public class Person { 	private String name; 	private Address address; 	private Car car; 	public Address getAddress() { 		return address; 	} 	public void setAddress(Address address) { 		this.address = address; 	} 	public Car getCar() { 		return car; 	} 	public void setCar(Car car) { 		this.car = car; 	} 	public String getName() { 		return name; 	} 	public void setName(String name) { 		this.name = name; 	} 	@Override 	public String toString() { 		return "Person [name=" + name + ", address=" + address + ", car=" + car + "]"; 	} } 
  | 
Main.java:
1 2 3 4 5 6 7 8 9 10 
  | package com.jay; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { 	public static void main(String[] args) { 		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml"); 		Person person = (Person)ctx.getBean("person"); 		System.out.println(person); 	} } 
  | 
注意
上述代码配了两个Address类型(address和address1),使用byName自动装配能运行,但是使用byType则会报异常,因为Address不唯一。
XML 配置里的 Bean 自动装配的缺点
在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些