14.3 Spring的自动装配
前面已经介绍了如何通过使用property元素来装配Bean中的属性。Spring还支持一种自动装配,通过该自动装配可以不用添加property元素去装配Bean中的属性,而是自动地装配Bean中的属性。
14.3.1 自动装配分类
Spring还支持一种自动装配,需要在bean元素中添加autowire属性,并指定自动装配类型,代码如下所示。
<bean id="teacher" class="net.hncu.demo05.Teacher" autowire="自动装配类型 "> <property name="name"> <value>张老师</value> </property> </bean>
自动装配包含如下4种类型。
❑ byName:在IoC容器中寻找与Bean中属性名相同的id对应的Bean,如果找不到相符合的Bean,则该属性没有被装配上。
❑ byType:在IoC容器中寻找与Bean中属性相同类型的Bean,如果找不到相符合的Bean,则该属性没有被装配上。如果找到多个相符合的Bean,则会抛出异常。
❑ constructor:在IoC容器中寻找与Bean中构造函数参数一致的一个或多个Bean。如果存在不确定的Bean,则会抛出异常。
❑ autodetect:自动模式,首先尝试使用constructor来自动装配,然后使用byType方式。
14.3.2 byName自动装配
修改id为teacher的Bean配置,使用byName自动装配。这时就不用使用property元素来装配Teacher类的student属性,Spring会自动将id为student的Bean实例注入到Teacher Bean实例的student属性中,代码如下所示。
<? 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.0.xsd"> <bean id="student" class="net.hncu.demo05.Student"> <property name="name"> <value>小强</value> </property> </bean> <bean id="teacher" class="net.hncu.demo05.Teacher" autowire="byName"> <property name="name"> <value>张老师</value> </property> </bean> </beans>
如果找不到id为student的Bean, Teacher Bean中的student属性将装配失败,代码如下所示。
<? 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.0.xsd"> <bean id="student22" class="net.hncu.demo05.Student"> <property name="name"> <value>小强</value> </property> </bean> <bean id="teacher" class="net.hncu.demo05.Teacher" autowire="byName"> <property name="name"> <value>张老师</value> </property> </bean> </beans>
14.3.3 byType自动装配
修改id为teacher的Bean配置,使用byType自动装配。这时将在IoC容器中寻找与Bean中属性相同类型的Bean。因为Teacher Bean中student属性类型Student,所以会在IoC容器中寻找类型为Student的Bean,并将类型为Student的Bean实例注入到Teacher Bean实例的student属性中,代码如下所示。
<? 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.0.xsd"> <bean id="student22" class="net.hncu.demo05.Student"> <property name="name"> <value>小强</value> </property> </bean> <bean id="teacher" class="net.hncu.demo05.Teacher" autowire="byType"> <property name="name"> <value>张老师</value> </property> </bean> </beans>
14.3.4 constructor自动装配
修改id为teacher的Bean配置,使用constructor自动装配。这时将在IoC容器中寻找与Teacher Bean中构造函数参数一致的Bean。因为Teacher Bean中的构造函数包含两个参数,分别为name和student,所以会在IoC容器中寻找类型与name参数和student参数相对应的Bean,代码如下所示。
<? 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.0.xsd"> <bean id="student22" class="net.hncu.demo05.Student"> <property name="name"> <value>小强</value> </property> </bean> <bean id="name" class="java.lang.String"> <constructor-arg> <value>张老师</value> </constructor-arg> </bean> <bean id="teacher" class="net.hncu.demo05.Teacher" autowire="constructor"> </bean> </beans>