byName自动装配和byType自动装配
依赖注入DI(其实就是对象的创建和对象的属性赋值交给容器)_Pr Young的博客-CSDN博客
这里的创建对象,给对象的属性赋值的方式是手动的
我们现在要做的不用我们手动,由容器自动赋值
先创建两个类,一个Cat类,一个Dog类
public class Cat
{
public void shout()
{
System.out.println("miao~");
}
}
public class Dog
{
public void shout()
{
System.out.println("wang~");
}
}
然后创建一个People类,上面两个类的对象都是这个类的属性,表示一个人养了一只猫和一只狗
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;
}
}
web.xml文件里面:
//new一个Cat类的对象cat1
<bean id="cat1" class="com.kuang.pojo.Cat"/>
//new一个Dog类的对象dog1
<bean id="dog1" class="com.kuang.pojo.Dog"/>
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1" class="com.kuang.pojo.People">
<property name="name" value="欧阳水鸣"/>
<property name="cat" ref="cat1"/>
<property name="dog" ref="dog1"/>
</bean>
byName自动装配:
People类的对象people1里面有两个属性是别的类的对象(Dog,Cat类)
容器会遍历容器里面每一个对象的id,如果这个对象的id是Dog类的首字母小写dog,Cat类的首字母cat,就把这个对象赋值给people1的两个属性
但是你如果id叫dog111,或者cat2,这样是识别不出来的,无法赋值成功,id只能是类的名字首字母小写,这是严格规定的
//new一个Cat类的对象cat1
<bean id="cat" class="com.kuang.pojo.Cat"/>
//new一个Dog类的对象dog1
<bean id="dog" class="com.kuang.pojo.Dog"/>
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1" class="com.kuang.pojo.People" autowire="byName">
<property name="name" value="欧阳水鸣"/>
</bean>
byType自动装配
People类的对象people1里面有两个属性是别的类的对象(Dog,Cat类)
容器会遍历容器里面每一个对象,查询这个对象所属的类,如果这个对象所属的类是Dog类,或者是Cat类,就把这个对象赋值给people1的两个属性
所以不管容器内bean的id叫什么,只要它是Dog类的对象和Cat类的对象,就能赋值成功
所以这要求在容器内,一个类只能有一个对象,不能一个类new出多个对象,要不然不知道赋哪个值
//new一个Cat类的对象cat1
<bean id="cat333" class="com.kuang.pojo.Cat"/>
//new一个Dog类的对象dog1
<bean id="dog123" class="com.kuang.pojo.Dog"/>
//new一个People类的对象people1,并且给他的两个属性cat赋值cat1对象,dog赋值dog1对象
<bean id="people1" class="com.kuang.pojo.People" autowire="byType">
<property name="name" value="欧阳水鸣"/>
</bean>