上篇文章我们已经讲了IOC和DI的一些基本概念以及 配置bean的两种 方式,其中bean配置还有一些细节性的东西,还是需要我们花点时间找相关的文档去学习了解的,例如null值配置、特殊字符配置和p命名空间等等。接下来,我们开始讲一下bean的自动装配,都将用到前面的知识。
还是先上代码吧:
一个人有名字有车有住址:
public class Person {
private Car car;
private String name;
private Adress adress;
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;
}
public Adress getAdress() {
return adress;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
@Override
public String toString() {
return "Person [car=" + car + ", name=" + name + ", adress=" + adress + "]";
}
}
车有品牌和价格:
package com.yixingu.autowire;
public class Car {
private String brand;
private String sprice;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSprice() {
return sprice;
}
public void setSprice(String sprice) {
this.sprice = sprice;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", sprice=" + sprice + "]";
}
}
住址有城市和街道:
package com.yixingu.autowire;
public class Adress {
private String city;
private String street;
@Override
public String toString() {
return "Adress [city=" + city + ", street=" + 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;
}
public Adress(String city, String street) {
super();
this.city = city;
this.street = street;
}
}
接下来就是我们的配置文件了:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:p="http://www.springframework.org/schema/p">
<bean id="car" class="com.yixingu.autowire.Car">
<property name="brand" value="audi"/>
<property name="sprice" value="300000"/>
</bean>
<bean id="adress" class="com.yixingu.autowire.Adress">
<constructor-arg value="YangJiang" type="String"/>
<constructor-arg value="XiTou" type="String"/>
</bean>
<bean id="person" class="com.yixingu.autowire.Person"
p:name="yixingu" autowire="byName">
</bean>
</beans>
配置文件中用到了属性注入,构造器注入,p命名空间以及今天的自动装配:autowire属性。
自动装配有两种方式:byName和byType。
其中byName是根据bean的set方法属性名来配置的,如果我将配置文件中的id car改成car1,那么autowire将无法为我们自动配置到car。
byType是根据bean的属性类型来配置,如果一个配置文件中有多个同类型的bean时将抛异常,如果我们再配置一个car2,那么运行时将抛出异常。
这也是自动装配的局限性:byName和byType只能选其一;不能选择性自动装配个别bean,一旦使用了autowire属性,那么只能装配所有的属性值,不够灵活。
当然autowire还是有它的优点的,如果我们不考虑上面的局限性的话,autowire还是可以很方便地为我们实现bean的注入的。