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 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些