2.新建两个实体类,Cat Dog 都有一个叫的方法
public class Cat { public void shout() { System.out.println("miao~"); } } public class Dog { public void shout() { System.out.println("wang~"); } }3.新建一个用户类 User
public class User { private Cat cat; private Dog dog; private String str; }4.编写Spring配置文件
<?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 "> <bean/> <bean/> <bean> <property ref="cat"/> <property ref="dog"/> <property value="qinjiang"/> </bean> </beans>5.测试
public class MyTest { @Test public void testMethodAutowire() { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user = (User) context.getBean("user"); user.getCat().shout(); user.getDog().shout(); } }结果正常输出,环境OK
ByName
autowire byName (按名称自动装配)
由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。
采用自动装配将避免这些错误,并且使配置简单化。
测试:
1.修改bean配置,增加一个属性 autowire="byName"
<bean autowire="byName"> <property value="qinjiang"/> </bean>2.再次测试,结果依旧成功输出!
3.我们将 cat 的bean id修改为 catXXX
4.再次测试, 执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误。
小结:
当一个bean节点带有 autowire byName的属性时。
将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。
去spring容器中寻找是否有此字符串名称id的对象。
如果有,就取出注入;如果没有,就报空指针异常。
ByType
autowire byType (按类型自动装配)
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
NoUniqueBeanDefinitionException
测试:
1.将user的bean配置修改一下 : autowire="byType"
2.测试,正常输出
3.在注册一个cat 的bean对象!
<bean/> <bean/> <bean/> <bean autowire="byType"> <property value="qinjiang"/> </bean>4、测试,报错:NoUniqueBeanDefinitionException
5、删掉cat2,将cat的bean名称改掉!测试!因为是按类型装配,所以并不会报异常,也不影响最后的结果。甚至将id属性去掉,也不影响结果。
这就是按照类型自动装配!
5.2、使用注解jdk1.5开始支持注解,spring2.5开始全面支持注解。
准备工作:利用注解的方式注入属性。
1.在spring配置文件中引入context文件头
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context/spring-context.xsd2.开启属性注解支持!
<context:annotation-config/> @Autowired@Autowired是按类型自动转配的,不支持id匹配。
需要导入 spring-aop 的包!
测试:
1、将User类中的set方法去掉,使用 @Autowired 注解
public class User { @Autowired private Cat cat; @Autowired private Dog dog; private String str; public Cat getCat() { return cat; } public Dog getDog() { return dog; } public String getStr() { return str; } }2、此时配置文件内容
<context:annotation-config/> <bean/> <bean/> <bean/>3、测试,成功输出结果!
【科普时间】