• Spring 简化装配Bean的配置方式


    简化配置方式

    Spring 为字面值、引用 Bean 和集合都提供了简化的配置方式。如果没有用到完整配置格式的特殊功能,用户大可使用简化的配置方式。下面分别为上面提及的配置内容给出简化前和简化后的版本。

    1.字面值属性

      简化前 简化后
    字面值属性

    <property name="maxSpeed">
      <value>200</value>
    </property>

    <property name="maxSpeed" value="200"/>
    构造函数参数

    <constructor-arg type="java.lang.String">
      <value>红旗CA72</vaIue>
    </constructor-arg>

    <constructor-arg type="java.lang.String" value="红旗CA72"/>
    集合元素

    <map>
      <entry>
        <key><vaIue>AM</value></key>
        <value>会见客户</value>
      </entry>
    </map>

    <map>
      <entry key="AM" value="会见客户"/>
    </map>

    如果使用简化的方式,则将无法使用 <![CDATA[ ]]> 处理XML特殊字符,只能用XML转义序列对特殊字符进行转换。

    2.引用对象属性

      简化前 简化后
    字面值属性

    <property name="car">
      <ref bean="car"></ref>
    </property>

    <property name="car" ref="car"/>
    构造函数参数

    <constructor-arg>
      <ref bean="car"/>
    </constructor-arg>

    <constructor-arg ref="car"/>
    集合元素

    <map>

      <entry>

        <key><ref bean="keyBean"/></key>

        <ref bean="valueBean"/>

      </entry>

    </map>

    <map>
      <entry key-ref="keyBean" value-ref="valueBean"/>
    </map>

    <ref> 的简化形式对应于<ref bean="xxx">,而<ref local="xxx">和<ref parent="xxx"> 则没有对应的简化形式。

    3.使用 p 命名空间

    为了简化 XML 文件的配置,越来越多的 XML文件采用属性而非子元素配置信息。Spring 从2.5版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。使用 p 命名空间后,基于 XML 的配置方式将进一步简化。

    使用 p 命名空间前

    <?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-4.0.xsd">
    
      <bean id="car" class="com.smart.ditype.Car">
        <property name="brand" value="红旗&amp;CA72"/>
        <property name="maxSpeed" value="200"/>
        <property name="price" value="20000.00"/>
      </bean>
      <bean id="boss" class="com.smart.ditype.Boss">
        <property name="car" ref="car"/>
      </bean>
    </beans>

    使用 p 命名空间后

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
      
      <
    bean id="car" class="com.smart.ditype.Car"     p:brand="红旗&amp;CA72"     p:maxSpeed="200"     p:price="20000.00"/>   <bean id="boss" class="com.smart.ditype.Boss"     p:car-ref="car"/> </beans>

    未采用 p 命名空间前,<bean> 使用 <property> 子元素配置Bean的属性:采用 p 命名空间后,采用 <bean> 的元素属性配置 Bean 的属性。

    对于字面值属性,其格式为:p:<属性名>="xxxx"

    对于引用对象的属性,其格式为:p:<属性名>-ref="xxxx"

    正是由于 p 命名空间中的属性名是可变的,所以 p 命名空间没有对应的 Schema 定义文件,也就无须在 xsi:schemaLocation 中为 p 命名空间指定 Schema 定义文件。

    自动装配

    Spring Ioc 容器知道所有 Bean 的配置信息,此外,通过 Java 反射机制还可以获知实现类的结构信息,如构造函数方法的结构、属性等信息。掌握所有 Bean 的这些信息后,Spring Ioc 容器就可以按照某种规则对容器中的 Bean 进行自动装配,而无须通过显式的方式进行依赖配置。Spring 为厌恶配置的开发人员提供了一种轻松的方法,可以按照某些规则进行 Bean 的自动装配。

    <bean> 元素提供了一个指定自动装配类型的属性:autowire="<自动装配类型>"。Spring 提供了4种自动装配类型,用户可以根据具体情况进行选择,如下表所示。

    自动装配类型 说明
    byName

    根据名称进行自动匹配。假设Boss有一个名为car的属性,如果容器中刚好有一个名为car的Bean,
    Spring就会自动将其装配给Boss的car属性

    byType

    根据类型进行自动匹配。假设Boss有一个car类型的属性,如果容器中刚好有一个Car类型的
    Bean,Spring就会自动将其装配给Boss的这个属性

    constructor

    与ByType类似,只不过它是针对构造函数注入而言的。如果Boss有一个构造函数,构造函数包
    含一个Car类型的入参,如果容器中有一个Car类型的Bean,则Spring将自动把这个Bean作为Boss
    构造函数的入参;如果容器中没有找到和构造函数入参匹配类型的Bean,则Spring将抛出异常

    autodetect

    根据Bean的自省机制决定采用byType还是constructor进行自动装配。如果Bean提供了默认的构
    造函数,则采用byType:否则采用constructor

    <beans> 元素标签中的 default-autowire 属性可以配置全局自动匹配,default-autowire 属性的默认值为 no,表示不启用自动装配;其他几个可选配置值分别为 byName、byType、constructor 和 autodetect,这几个配置值的含义是不言自明的。不过在 <beans> 中定义的自动装配策略可以被 <bean> 的自动装配策略覆盖。

    自动装配以四两拨千斤的方式完成容器中 Bean 之间的装配工作,这种省心省力的自动装配机制确实省却了大量配置工作。在实际开发中,XML 配置方式很少启用自动装配功能,而基于注解的配置方式默认采用 byType 自动装配策略。

  • 相关阅读:
    C++ 虚函数表解析(转载)
    javaWeb中的/路径问题
    java创建多线程(转载)
    JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
    Class.forName()的作用与使用总结(转载)
    Java内存模型
    java-锁膨胀的过程
    java对象头信息和三种锁的性能对比
    并发容器
    synchronized和volatile以及ReentrantLock
  • 原文地址:https://www.cnblogs.com/jwen1994/p/11037496.html
Copyright © 2020-2023  润新知