自动装配说明:
·自动装配是使用Spring满足bean依赖的一种方法
·spring会在应用上下文中为某个bean寻找其依赖的bean
Spring中bean有三种装配机制,分别是
(1)在xml中显式配置
(2)在java中显式配置
(3)隐式的bean发现机制和自动装配
Spring自动装配需要从两个角度来实现,或者说是两个操作:
1、组件扫描:spring会自动发现应用上下文中所创建的bean;
2、自动装配:spring自动满足bean之间的依赖,也就是我们说的IOC/DI
组件扫描和自动装配组合发挥巨大威力,使得显示的配置降到最低
测试环境搭建
1、新建项目
2、新建两个实体类,Cat、Dog 都有一个shout方法
public class Dog {
public void shout(){
System.out.println("wang~");
}
}
public class Cat {
public void shout(){
System.out.println("miao~");
}
}
3、新建一个用户类
package pojo;
/**
* @author admin $
* @title $
* @description $
* @updateTime $ 17:44$ $
* @throws $
*/
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 + '\'' +
'}';
}
}
4、编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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-2.5.xsd">
<bean id="dog" class="pojo.Dog"/>
<bean id="cat" class="pojo.Cat"/>
<bean id="people" class="pojo.People">
<property name="name" value="花泽生菜"/>
<property name="dog" ref="dog"/>
<property name="cat" ref="cat"/>
</bean>
</beans>
5、测试
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.People;
public class Test01 {
@Test
public void test01(){
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
People people=(People) context.getBean("people");
people.getCat().shout();;
people.getDog().shout();
}
}
ByName
aotowire byName(按名称自动装配)
由于在手动配置xml的过程中,常常发生字母缺漏和 大小写等错误,而无法对其进行检查,是的开发效率降低。
采用自动装配将避免这些错误,并且使配置简单化。
测试:
1、修改bean配置,增加一个属性
autowire="byName"
<bean id="people" class="pojo.People" autowire="byName">
<property name="name" value="花泽生菜"/>
</bean>
2、再次测试
3、我们将cat的bean id修改为catXXX
4、再次测试,执行时报空指针
java.lang.NullPointerException 因为按byName的规则找不到对应set()方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误
小结:
当一个bean节点带有autowire byName的属性时
1、将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat
2、去spring 容器中寻找是否有此字符串名称id的对象
3、如果有,就取出注入;如果没有,就报空指针异常
byType
autowire byType(按类型自动装配)
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一,如果不唯一,会报不唯一异常
NoUniqueBeanDefinitionException
测试:
1、将people的bean配置改一下
: autowire="byType"
2、测试,正常输出
3、在注册一个cat的bean对象
<bean id="dog" class="pojo.Dog"/>
<bean id="cat" class="pojo.Cat"/>
<bean id="cat22" class="pojo.Cat"/>
<bean id="people" class="pojo.People" autowire="byType">
<property name="name" value="花泽生菜"/>
</bean>
5、测试报错 如下图所示
5、删掉cat22 一切正常