使用基于 XML 的配置bean时,可以使用<bean / > 元素的autowire属性为 bean 定义指定自动装配模式。
自动装配具有以下优点:
但是也有些局限性和缺点:
模式 | 解释 |
---|---|
no | (默认)无自动装配。 |
byName | 按属性名称自动装配 |
byType | 如果容器中恰好存在一个该属性类型的 bean,则使该属性自动装配。 |
constructor | 类似于byType,但适用于构造函数参数。 |
常用的为byName和byType
通俗来说:
byName:需要保证所有bean的id唯一,并且需要和自动装配的属性的set方法的值一致。
byType:需要保证所有的bean的calss唯一,并且这个bean需要和自动装配的属性类型一致。
<bean id="cat" class="com.tang.pojo.Cat"/>
<!-- 注意此时的id不一样 -->
<bean id="dog22222" class="com.tang.pojo.Dog"/>
<!-- 自动装配-->
<bean id="people" class="com.tang.pojo.People" autowire="byName">
<property name="name" value="一个人" />
</bean>
注意:
byName会在上下文中查找和自己对象set后面的方法一致的beanid,如果不一致,就会报空指针异常
<bean id="cat" class="com.tang.pojo.Cat"/>
<bean id="dog22222" class="com.tang.pojo.Dog"/>
<!-- 自动装配-->
<bean id="people" class="com.tang.pojo.People" autowire="byType">
<property name="name" value="一个人" />
</bean>
注意:
byType会在上下文中查找和自己对象属性类型相同的bean
实体类:
public class Cat {
public void shout(){
System.out.println("喵喵~");
}
}
public class Dog {
public void shout(){
System.out.println("汪汪~");
}
}
public class People {
private Cat cat;
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
}
beans.xml:
<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">
<bean id="cat" class="com.tang.pojo.Cat"/>
<bean id="dog22222" class="com.tang.pojo.Dog"/>
<!-- 自动装配-->
<bean id="people" class="com.tang.pojo.People" autowire="byType">
<property name="name" value="一个人" />
</bean>
</beans>
测试类:
public class MyTest {
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
people.getCat().shout();
people.getDog().shout();
}
}