自动装配类型
1、byName
通过属性的setter方法名和配置的bean的ID自动匹配,注意是用setter方法和bean匹配,不是属性去匹配。
- Person类
package com.yusys.spring;
public class Person {
private String name;
private int age;
private Car car;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}
}
- 配置文件:
<bean id="car" class="com.yusys.spring.Car">
<property name="brand" value="BMW"></property>
<property name="price" value="1000"></property>
</bean>
<bean id="person" class="com.yusys.spring.Person" autowire="byName">
<property name="name" value="小明"></property>
<property name="age" value="10"></property>
<!-- 如果手动装配,这里有要配置car属性 -->
</bean>
上面配置了一个id为car的bean和一个设置了自动装配为byName的person。
而在Person类中,对于car属性有个setCar方法,这时候set后面的Car和car匹配到。
- 测试类:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person) ctx.getBean("person");
System.out.println(p);
结果:
如何证明是使用setter方法匹配而不是用属性匹配的呢?
- 改造Person类
package com.yusys.spring;
public class Person {
private String name;
private int age;
private Car car1;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setCar(Car car1) {
this.car1 = car1;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car1 + "]";
}
}
将car属性该为car1,只有setCar不修改。再运行测试,结果一样。
如果保持car属性名不变,修改setter方法,将setCar该为setCar1,再运行测试,结果匹配不到car:
2、ByType
根据类型匹配,这种方式时根据定义的属性的类型进行匹配,如果容器中定义了class和属性类型一样的bean就匹配上了。这时候id可以省略不写。
<bean id="car" class="com.yusys.spring.Car">
<property name="brand" value="BMW"></property>
<property name="price" value="1000"></property>
</bean>
<bean id="person" class="com.yusys.spring.Person" autowire="byType">
<property name="name" value="小明"></property>
<property name="age" value="10"></property>
<!-- 如果手动装配,这里有要配置car属性 -->
</bean>
这种方式有个很大的缺陷:如果配置了多个Car的bean,就会出错
总结:这种在配置文件中使用的自动装配还是有很多缺陷的,一般不会用。这里只是讲解下byName和byType自动装配的概念而已。在后面会有基于注解的自动装配方式也会涉及到这方面的概念。