Spring IOC 容器可以自动装配 Bean, 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式。
自动装配模式
1. byType(根据类型自动装配):若 IOC 容器中有多个与目标 Bean 类型一致的 Bean。 在这种情况下,Spring 将无法判定哪个 Bean 最合适该属性,所以不能执行自动装配。
2. byName(根据名称自动装配):必须将目标 Bean 的名称和属性名设置的完全相同。
3. constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时。此种自动装配方式将会很复杂,不推荐使用。
自动装配的缺点
1. 在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性。然而,若只希望装配个别属性时,autowire 属性就不够灵活了。
2. autowire 属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之。
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些。
示例
1. 添加模型类
package xyz.huning.spring4.di.xml.beancfg.autowire;
public class Battery {
private int id;
private String type;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Battery [id=" + id + ", type=" + type + "]";
}
}
package xyz.huning.spring4.di.xml.beancfg.autowire;
public class Screen {
private int id;
private int size;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Screen [id=" + id + ", size=" + size + "]";
}
}
package xyz.huning.spring4.di.xml.beancfg.autowire;
public class Cellphone {
private int id;
private Battery battery;
private Screen screen;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Battery getBattery() {
return battery;
}
public void setBattery(Battery battery) {
this.battery = battery;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
@Override
public String toString() {
return "Cellphone [id=" + id + ", battery=" + battery + ", screen="
+ screen + "]";
}
}
2. 添加配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="battery" class="xyz.huning.spring4.di.xml.beancfg.autowire.Battery" p:id="1" p:type="high"></bean> <bean id="screen1" class="xyz.huning.spring4.di.xml.beancfg.autowire.Screen" p:id="1" p:size="9"></bean> <!--手动配置bean属性--> <bean id="cellphone1" class="xyz.huning.spring4.di.xml.beancfg.autowire.Cellphone" p:id="1" p:battery-ref="battery" p:screen-ref="screen1"></bean> <!--使用byName方式自动装配bean属性--> <bean id="cellphone2" class="xyz.huning.spring4.di.xml.beancfg.autowire.Cellphone" p:id="2" autowire="byName"></bean> <!--使用byType方式自动装配bean属性--> <bean id="cellphone3" class="xyz.huning.spring4.di.xml.beancfg.autowire.Cellphone" p:id="3" autowire="byType"></bean> </beans>
3. 添加测试类
package xyz.huning.spring4.di.xml.beancfg.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("autowire.xml");
Cellphone cellphone1 = ctx.getBean("cellphone1", Cellphone.class);
System.out.println(cellphone1);
Cellphone cellphone2 = ctx.getBean("cellphone2", Cellphone.class);
System.out.println(cellphone2);
Cellphone cellphone3 = ctx.getBean("cellphone3", Cellphone.class);
System.out.println(cellphone3);
((ClassPathXmlApplicationContext)ctx).close();
}
}
4. 执行结果