Spring学习笔记 (6)

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.xsd

2.开启属性注解支持!

<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、测试,成功输出结果!

【科普时间】

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspgwz.html