零基础学Struts
上QQ阅读APP看书,第一时间看更新

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>