spring(二)自动装配(非注解)
1.准备
一个people类,一个cat类,一个dog类,people含有dog和cat
Cat类:
public class Cat {
public void shout() {
System.out.println("miao");
}
}
Dog类:
public class Dog {
public void shout() {
System.out.println("wang");
}
}
People类:
public class People {
// 使用注解的时候,变量名必须和配置文件对应的bean的id相同,而且使用该注解的话,可以将注解加在对应的set方法上,如果加在属性上,
//对应的set方法可以省略
@Autowired
@Qualifier(value = "cat")
private Cat cat;
@Autowired
@Qualifier(value = "dog")
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 + '\'' +
'}';
}
}
2.不使用注解进行自动装配
2.1ByName实现自动装配
#ByName:会在容器上下文中查找和自己对象的set方法后面的值的对应的beanid
<bean id="cat" class="com.joker.pojo.Cat"/>
<bean id="dog" class="com.joker.pojo.Dog"/>
<bean id="people" class="com.joker.pojo.People" autowire="byName"></bean>
#使用byname的方式进行自动装配时,会在spring容器中去查找people中的set方法,如果想要装配成功,配置文件中两个动物的bean的id必须是people类中对应的set方法后面的值,如setDog,就会自动查找dog,将bean命名为dog1就会报错,原因是根据set后面的名称找不到对应的对象。
2.2ByType实现自动装配
#ByType:会在容器上下文中查找和自己对象属性所属类相同的beanclass,即dog是Dog类,就会去找Dog
<bean id="cat" class="com.joker.pojo.Cat"/>
<bean id="dog" class="com.joker.pojo.Dog"/>
<bean id="people" class="com.joker.pojo.People" autowire="bytype"></bean>
2.3总结ByName和ByType的区别
ByName:需要保证动物的beanid和people中set方法的名字的后面保持一致(setDog的Dog和bean中的id:dog)
ByType:需要保证在spring配置文件中对同一个类型的对象只存在一个bean,对此我们在注册动物的bean的时候甚至id都不需要写,只写一个class(比如:已经注册了id为dog的Dog对象就不能在注册id为dog1的Dog对象)