3、Spring4之Bean 配置的細節

TZQ_DO_Dreamer發表於2014-11-09

1). 若字面值中包含特殊字元,則可以使用 value 節點的 <![CDATA[]]> 把字面值包裹起來。

     <constructor-arg>
          <!-- 若 value 屬性值中包含特殊字串, 則可以使用 value 子節點來注入屬性值. value 子節點中可以使用 CDATA -->
          <value><![CDATA[Zheng <><> zhou]]></value>
     </constructor-arg>

2). 在 Bean 的配置檔案中, 可以通過 <ref> 元素或 ref  屬性為 Bean 的屬性或構造器引數指定對 Bean 的引用.

     <bean id="dao" class="com.atguigu.spring.ioc.ref.Dao">
          <property name="database" value="DB2"></property>
     </bean>

     <bean id="service2" class="com.atguigu.spring.ioc.ref.Service">
          <property name="dao" ref="dao"></property>
     </bean>
     ------------------------------------------------------------------------------
     解析:<property name="dao" ref="dao"></property> 的作用為:
          Dao dao = (Dao)ctx.getBean("dao");
          Service service = (Service)ctx.getBean("service2");
          service.setDao(dao);

3). 可以在屬性或構造器裡包含 Bean 的宣告, 這樣的 Bean 稱為內部 Bean

     <bean class="com.atguigu.spring.ioc.ref.Service" id="service">
          <property name="dao">
               <bean class="com.atguigu.spring.ioc.ref.Dao">
                    <property name="database" value="MySQL"></property>
               </bean>

          </property>
     </bean>

     解釋:類似於以下程式碼,但 dao 的這個 bean 其實是沒有 id 的,也不能被其他的 bean 來引用,也不能單獨從 IOC 容器中獲取。

          <bean class="com.atguigu.spring.ioc.ref.Dao" id="dao">
               <property name="database" value="MySQL"></property>
          </bean>

          <bean class="com.atguigu.spring.ioc.ref.Service" id="service">
               <property name="dao" ref="dao"></property>
          </bean>         

          ①. 當 Bean 例項僅僅給一個特定的屬性使用時, 可以將其宣告為內部 Bean.
                內部 Bean 宣告直接包含在 <property> 或 <constructor-arg> 元素裡, 不需要設定任何 id 或 name 屬性
          ②. 內部 Bean 不能使用在任何其他地方

4). 可以使用專用的 <null/> 元素標籤為 Bean 的字串或其它物件型別的屬性注入 null 值

     <bean id="car6" class="com.atguigu.spring.ioc.Car">
          <!-- 為 maxSpeed 賦值為 null, 而 value="null" 是把 null 這個字串賦給了對應的屬性 -->
          <property name="corp"><null/></property>
     </bean>


5). Spring 支援級聯屬性的配置。

     <bean id="action3" class="com.atguigu.spring.ioc.ref.Action">
          <property name="service" ref="service2"></property>

          <!-- 為 service 的 dao 的 database 賦值為 ORACLE -->
          <property name="service.dao.database" value="ORACLE"></property>
     </bean>

6). 配置 java.util.List 型別的屬性, 需要指定 <list>  標籤, 在標籤裡包含一些元素.
     這些標籤可以通過 <value> 指定簡單的常量值, 通過 <ref> 指定對其他 Bean 的引用.
     通過<bean> 指定內建 Bean 定義.
     通過 <null/> 指定空元素. 甚至可以內嵌其他集合.

     <property name="cars">
          <!-- 通過 list 指定集合屬性的值. 但 list 是一個內部 list, 不能被其他的 bean 引用.  -->
          <list>
               <!-- ref 直接指向已有的 bean -->
               <ref bean="car"/>
               <ref bean="car2"/>
               <ref bean="car3"/>
               <!-- bean 宣告內部 bean -->
               <bean class="com.atguigu.spring.ioc.Car">
                    <property name="brand" value="BMW"></property>
                    <property name="corp" value="HuaChen"></property>
                    <property name="maxSpeed" value="300"></property>
                    <property name="price" value="800000"></property>
               </bean>
          </list>
     </property>

7).  可以使用 util schema 裡的集合標籤定義獨立的集合 Bean. 需要注意的是, 必須在 <beans> 根元素裡新增 util schema 定義

①. 匯入 util 名稱空間

<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:util="http://www.springframework.org/schema/util"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">


②. 定義集合 Bean

     <util:list id="cars">
          <!-- ref 直接指向已有的 bean -->
          <ref bean="car"/>
          <ref bean="car2"/>
          <ref bean="car3"/>

          <!-- bean 宣告內部 bean -->
          <bean class="com.atguigu.spring.ioc.Car">
               <property name="brand" value="BMW"></property>
               <property name="corp" value="HuaChen"></property>
               <property name="maxSpeed" value="300"></property>
               <property name="price" value="800000"></property>
          </bean>
     </util:list>

8). 配置 Map Bean

     <util:map id="config">
          <entry key="user" value="root"></entry>
          <entry key="password" value="1230"></entry>
          <entry key="driverClass" value="com.mysql.jdbc.Driver"></entry>
          <entry key="jdbcUrl" value="jdbc:mysql:///test"></entry>

     </util:map>

9). 配置 Properties 的屬性

     <property name="properties">
          <props>
               <prop key="hibernate.hbm2ddl.auto">update</prop>
               <prop key="b">B</prop>
               <prop key="c">C</prop>
               <prop key="d">D</prop>
          </props>

     </property>

10). 使用 p 名稱空間簡化 bean 的屬性配置:

     ①. 匯入  p 的名稱空間

     <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:util="http://www.springframework.org/schema/util"
          xmlns:p="http://www.springframework.org/schema/p"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">


     ②. 使用 p 名稱空間進行配置

     <bean id="car7" class="com.atguigu.spring.ioc.Car"
               p:brand="Mazda"
               p:corp="ChangAn"
               p:maxSpeed="220"
               p:price="200000"
/>

相關文章