六 Spring-XML設置Bean的值

目錄

1. Web MVC發展史歷程
2.Spring概要
3.Spring-依賴注入概要(IOC)
4.屬性注入的三種實現方式
5.Spring-IoC XML裝配
6.Spring-XML設置Bean的值
7.Spring-IoC 注解(1)
8.Spring-IoC 注解(2)
9.Spring-AOP切面編程(1)
10.Spring-AOP切面編程(2)
未完待續...
未完待續...

一、簡介

有些時候Spring裝配Bean的時候,我們需要初始化一些屬性的時候,我們就需要在bean中定義

  1. 構造注入
  2. setter注入
  3. 自動裝配

二、constructor-arg

  1. 說明
    通過指定構造方法的參數來實例化Bean
  2. 可選屬性
    屬性 說明
    type 根據參數的類型,避免構造方法沖突
    value 用于指定字符串類型、基本類型的屬性值
    name 屬性的名稱
    ref 關聯其它類型
    index 對應于構造函數的多個參數,index屬性的值從0開始
  3. 示例代碼
    java代碼
    public class Shop {
        private int shopId;
        private String title;
        private String name;
        public Shop() {
        }
        public Shop(int shopId, String title) {
            this.shopId = shopId;
            this.title = title;
        }
        public Shop(String title, String name) {
            this.title = title;
            this.name = name;
        }
        public Shop(int shopId, String title, String name) {
            this.shopId = shopId;
            this.title = title;
            this.name = name;
        }
        public int getShopId() {
            return shopId;
        }
        public void setShopId(int shopId) {
            this.shopId = shopId;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Shop{" +
                    "shopId=" + shopId +
                    ", title='" + title + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
    xml代碼
    <bean id="shop" class="com.wener.example.bean.Shop">
        <!--通過構造方法注入-->
        <constructor-arg type="int" value="1"/>
        <constructor-arg type="java.lang.String" value="iPhone X"/>
    </bean>
    <!-- 或者 -->
    <bean id="shop" class="com.wener.example.bean.Shop">
        <!--通過構造方法注入-->
       <constructor-arg index="0" value="1"/>
       <constructor-arg index='title' value="手機"/>
       <constructor-arg index='2' value="iPhone X"/>
    </bean>
    <!--或者-->
    <bean id="shop" class="com.wener.example.bean.Shop">
        <!--通過構造方法注入-->
       <constructor-arg name="id" value="1"/>
       <constructor-arg index='1' value="手機"/>
       <constructor-arg index='name' value="iPhone X"/>
    </bean>
    
    測試代碼
    ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    Shop shop = context.getBean("shop", Shop.class);
    System.out.println(shop.toString());
    

三、property

  1. 說明
    在 Spring 配置文件中,我們也可以通過 Bean 的屬性 property 進行參數注入。使用 property 屬性不但可以將 String、int 等字面值注入到 Bean 中,還可以將集合、Map 等類型注入到 Bean 中,此外還可以注入其他的 Bean
    必須提供setter方法,因為需要通過名字自動裝配
  2. 可選屬性
    屬性 說明
    name 屬性的名稱
    value 主要是配置基本類型的屬性值,
    ref 但是如果我們需要為Bean設置屬性值是另一個Bean實例時,這個時候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下兩個屬性。bean:引用不在同一份XML配置文件中的其他Bean實例的id屬性值。local:引用同一份XML配置文件中的其他Bean實例的id屬性值
  3. 示例代碼
    java代碼
    public class Shop {
     ...
        private ShopDetail detail;
        public void setDetail(ShopDetail detail) {
            this.detail = detail;
        }
        public ShopDetail getDetail() {
            return detail;
        }
    }
    public class ShopDetail {
        private String desc;
        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }
    
    xml配置
    <bean id="detail" class="com.wener.example.bean.ShopDetail">
        <property name="desc" value="demo"/>
    </bean>
    
    測試代碼
    ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    Shop shop = context.getBean("shop", Shop.class);
    System.out.println(shop.getDetail().getDesc());
    

四、autowire

  1. 說明
    在bean標簽上通過autowire屬性;或者在beans標簽上通過default-autowire屬性實現自動裝配
  2. 可選值
    可選值 說明
    no 不使用自動裝配。Bean的引用必須通過ref元素定義。
    byName 根據屬性名自動裝配。BeanFactory查找容器中的全部Bean,找出其中id屬性與屬性同名的Bean來完成注入。如果沒有找到匹配的Bean實例,則Spring不會進行任何注入
    byType 如果BeanFactory中正好有一個同屬性類型一樣的bean,就自動裝配這個屬性。如果有多于一個這樣的bean,就拋出一個致命異常,它指出你可能不能對那個bean使用byType的自動裝配。如果沒有匹配的bean,則什么都不會發生,屬性不會被設置。如果這是你不想要的情況(什么都不發生),通過設置dependency-check="objects"屬性值來指定在這種情況下應該拋出錯誤。
    constructor 這個同byType類似,不過是應用于構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則一個致命的錯誤會產生。
    default 采用父級標簽(即beans的default-autowire屬性)的配置。
  3. 示例代碼
    java代碼
    public class Application { 
        private User user;
        public Application(User user) {
            this.user = user;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    }
     public class User implements Serializable {
          private String id;
          private String name;
          private String sex;
          private Integer age;
          public void destroy() {
               System.out.println("銷毀!");
          }
          public void init() {
              System.out.println("初始化!");
    } 
    
    根據屬性名來加載
     <!-- xml配置 -->
    <bean id="application" class="com.wener.example.bean.Application" autowire="byName"/>  
    <bean id="user" class="com.wener.example.bean.User" />  
    
    根據類型來加載
    <!-- 注意:當一個Bean即使用自動裝配依賴,又使用ref顯示依賴時,則顯示指定的依賴就會覆蓋自動裝配 -->
    <bean id="user" class="com.wener.example.bean.User" /> 
    <!-- xml代碼 -->
    <bean id="app" class="com.wener.example.bean.Application" autowire="byType"/>
    
    根據構造方法來加載
    // java代碼
    public Application(User user) {
            this.user = user;
    }
    // xml配置
    <bean id="app" class="com.wener.example.bean.Application" autowire="constructor">
    </bean>
    

五、注入參數值詳解

1、說明

在 Spring 配置文件中,用戶可以通過 Bean 的屬性 property 進行參數注入。使用 property 屬性不但可以將 String、int 等基本注入到 Bean 中,還可以將List、Set、Map ,Properties等類型注入到 Bean 中,此外還可以注入其他的 Bean

2、基本類型注入

  1. 概要
    一般是指可用字符串表示的值,這些值可通過 <value>元素標簽進行注入。在默認情況下,基本數據類型及其封裝類、String 等類型都可以采取字面值注入的方式
  2. 示例代碼
    public class User {
        private String name;
        private String password;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
    <bean id="userId" class="com.wener.example.bean.User">
        <property name="name" value="小明"/>
        <property name="password" value="123456"/>
    </bean>
    

3、引入其他Bean

  1. 概要
    Spring IoC 容器中定義的 Bean 可以互相引用。<ref>元素可以通過 bean、local、parent 三個屬性引用其他 Bean 的屬性,
    • bean 可以引用統一配置文件中或者父容器中的 Bean
    • local 只能引用同一配置文件中的 Bean
    • parent 只能引用父容器中的 Bean
  2. 示例代碼
    見property案例

4、內部Bean

  1. 概要
    只會被當前的Bean所引用,不能被其它Bean引用
  2. 示例代碼
    <bean id="xx" class="com.wener.example.bean.Application">
        <property name="user">
            <bean class="com.wener.example.bean.User">
                <property name="name" value="內部Bean"/>
            </bean>
        </property>
    </bean>
    

5、級聯設置屬性

  1. 概要
    如果你想直接設置關聯Bean的屬性的值,可以設置級聯屬性
  2. 示例代碼
    <bean id="xxx" class="com.wener.example.bean.Application">
        <property name="user.name"  value="級聯屬性設置"/>
    </bean>
    

6、list

  1. 說明
    <list> 元素進行裝配,然后通過多個 <value> 設置基本類型的值,也可以使用<ref>類引用復雜的對象類型
  2. 示例代碼
    <bean id="complex" class="com.wener.example.bean.Complex">
        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
                <value>list3</value>
                <value>list4</value>
                <!-- 引用復雜對象 -->      
                <!-- <ref bean="user"/> -->          
            </list>
        </property>
    </bean>
    

7、map

  1. 說明
    <map> 元素進行裝配,然后通過多個 <entry> 元素設值,只是 entry 包含一個鍵值對的設置,也可以使用key-ref 屬性去引用之前定義好的 Bean 作為鍵,而用 value-ref 屬性引用之前定義好的 Bean 作為值
  2. 示例代碼
    <property name="map">
        <map>
            <entry key="k1" value="v1"/>
            <entry key="k2" value="v2"/>
            <entry key="k3" value="v3"/>
            <entry key="k4" value-ref="user"/>
        </map>
    </property>
    

8、set

  1. 說明
    <set> 元素進行裝配,可以通過value設置基本類型的值,也可以通過 <ref>去引用已經定義的Bean
  2. 示例代碼
    <property name="set">
        <set>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </set>
    </property>
    <property name="set">
        <set>
            <ref bean='user'/>
        </set>
    </property>
    

9、array

  1. 說明
    <array> 可以通過多個 <value> 元素設值
  2. 示例代碼
    <property name="array">
        <array>
            <value>1</value>
            <value>2</value>
            <value>3</value>
           <!-- <ref name="user"/> -->
        </array>
    </property>
    

10、properties

  1. 說明
    <properties> 元素進行裝配,通過多個 <property> 元素設值,只是 properties 元素有一個必填屬性 key ,然后可以設置值
  2. 示例代碼
    <property name="properties">
        <props>
            <prop key="k1">v1</prop>
        </props>
    </property>
    

11、其它

  1. 集合合
    子Bean可以繼承父Bean的同名屬性集合元素,并且使用merge屬性選擇是否合并,默認不合并。
  2. 示例代碼
    <bean id="parent" abstract="true" class="***">
      <property name="list">
        <set>
          <value>1</value>
          <value>2</value>
          <value>3</value>
        </set>
      </property>
    </bean>
    <bean id="child" parent="parent">
      <property name="list">
        <set merge="true">
          <value>4</value>
          <value>5</value>
        </set>
      </property>
    

12、總結

  1. value:指定集合元素是基本數據類型或者字符類型值。
  2. ref:指定集合元素師容器中另一個Bean實例。
  3. bean:指定集合元素是一個嵌套Bean。

六、命名空間裝配

1、概要

除了上述的配置方式外,Spring3.0以上的版本還為上述的方式提供了一些簡寫方式

2、c

  1. 說明
    命名空間-c屬性名以 “c:” 開頭,也就是命名空間的前綴,通過構造器注入的方式來配置 bean,接下來就是要裝配的構造器參數名
  2. 示例代碼
    <beans 
      ...    
      xmlns:c="http://www.springframework.org/schema/c">
    </beans>
    
    <!-- 未引入之前-->
    <bean id="shop" class="com.wener.example.bean.Shop">
        <!--通過構造方法注入-->
        <constructor-arg type="int" value="1"/>
        <constructor-arg type="java.lang.String" value="iPhone X"/>
    </bean>
    <!--簡寫方式 -->
     <bean id="shop" class="com.wener.example.bean.Shop"  c:shopId="1" c:name="測試"/>
    

3、p

  1. 說明
    命名空間-p通過setter的注入方式來配置 bean
  2. 示例代碼
    <!-- 未引入之前-->
    <bean id="userId" class="com.wener.example.bean.User" scope="prototype">
        <property name="name" value="小明"/>
        <property name="password" value="123456"/>
    </bean>
    <!--簡寫方式 -->
    <bean id="user4" 
          class="com.wener.example.bean.User" 
          p:name="admin" 
          p:password="123"/>
    <bean id="app"
          class="com.wener.example.bean.Application"
          p:user-ref="user" />
    

4、util

  1. 說明
    工具類的命名空間,可以簡化集合類元素的配置
  2. util命名空間表
    元素 描述
    <util:list> 創建一個 java.util.List 類型的 bean,其中包含值或引用
    <util:map> 創建一個 java.util.map 類型的 bean,其中包含值或引用
    <util:properties> 創建一個 java.util.Properties 類型的 bean
    <util:property-path> 引用一個 bean 的屬性(或內嵌屬性),并將其暴露為 bean
    <util:set> 創建一個 java.util.Set 類型的 bean,其中包含值或引用
    <util:constant> 引用某個類型的 public static 域,并將其暴露為 bean

5、util:list

  1. 說明
    可以通過util:list來定義一個java.util.List類型的bean,其子元素就是對應的List的元素,其子元素可以是一切可以用來定義對象的元素,比如value、bean等,
    默認元素的值是String類型,可以通過value-type屬性指定元素值的類型,比如數字類型則指定value-type="java.lang.Integer"
    默認生成的是java.util.ArrayList類型的List,如果需要使用其它類型的List,則可以通過list-class來指定。比如下面就指定了生成的List是java.util.LinkedList
  2. 示例代碼
    <bean id="complex" class="com.wener.example.bean.Complex" p:list="list"/>
    <util:list id="list" value-type="java.lang.String" list-class="java.util.LinkedList">
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </util:list>
    

6、util:map

  1. 說明
    通過util:map來定義一個Map類型的, Map中的每一個Entry則由其子元素entry來定義。每個Entry的key和value可以通過entry元素的key和value屬性來定義
    默認key和value的值是String類型,如果想修改類型可以通value-type屬性指定value的類型,如果是復制的類型可以通過value-ref來引入
    默認生成的是`java.util.HashMap,如果想使用其他類型的Map,可以通過map-class來指定
  2. 示例代碼
    <util:map id="map"
              value-type="java.lang.Object"
              key-type="java.lang.Object">
        <entry value-ref="list" key-ref="set"/>
    </util:map>
    

7、util:set

  1. 說明
    通過util:set來定義一個java.util.Set類型的bean。它的用法和util:list是類似的。
    通過value子元素指定的值默認也是java.lang.String類型,可以通過value-type屬性來指定元素類型
    默認生成的Set是java.util.LinkedHashSet類型,可以通過set-class屬性來指定生成的Set的類型
  2. 示例代碼
    <util:set id="set" value-type="java.lang.Integer" set-class="java.util.HashSet">
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </util:set>
    

8、util:properties

  1. 說明
    可以通過util:properties快速的定義一個Properties對象,可以通過其子元素<prop key=""></prop>來定義一個Properties的元素,key對應屬性名,而<prop>元素中間的文本值則為對應的屬性值
    util:properties的內容也可以來自一個外部文件,此時可以通過location屬性引用對應的外部文件,通過location屬性指定的本地文件也可以是多個,多個文件之間可以通過英文的逗號分隔
  2. 示例代碼
    <util:properties id="properties">
        <prop key="a">a</prop>
        <prop key="b">b</prop>
    </util:properties>
    
    <!--在工程的Resources目錄下新建一個 util.properties的文件 -->
    <util:properties id="properties" location="util.properties,xxx.properties"/>
    

9、util:constant

  1. 說明
    util:constant可以把一個常量定義為bean容器中的一個bean,可以通過id屬性指定對應的bean的id。static-field用來指定引用的static變量,需要是public類型的
  2. 示例代碼
    public static final Integer ERROR = -1;
    <util:constant id="error" static-field="com.wener.example.bean.Application.ERROR" />
    

10、util:property-path

  1. 說明
    util:property-path可以用來把某個bean的某個屬性的值定義為一個bean,
  2. 示例代碼
    <util:property-path id="username" path="user_path.name"/>
    <bean id="user_path" class="com.wener.example.bean.User" scope="prototype">
        <property name="name" value="小明"/>
        <property name="password" value="123456"/>
    </bean>
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。