六 Spring-XML設(shè)置Bean的值

目錄

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

一、簡介

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

  1. 構(gòu)造注入
  2. setter注入
  3. 自動裝配

二呻逆、constructor-arg

  1. 說明
    通過指定構(gòu)造方法的參數(shù)來實例化Bean
  2. 可選屬性
    屬性 說明
    type 根據(jù)參數(shù)的類型,避免構(gòu)造方法沖突
    value 用于指定字符串類型、基本類型的屬性值
    name 屬性的名稱
    ref 關(guān)聯(lián)其它類型
    index 對應(yīng)于構(gòu)造函數(shù)的多個參數(shù)挥下,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">
        <!--通過構(gòu)造方法注入-->
        <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">
        <!--通過構(gòu)造方法注入-->
       <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">
        <!--通過構(gòu)造方法注入-->
       <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 進行參數(shù)注入欺缘。使用 property 屬性不但可以將 String、int 等字面值注入到 Bean 中挤安,還可以將集合谚殊、Map 等類型注入到 Bean 中,此外還可以注入其他的 Bean
    必須提供setter方法蛤铜,因為需要通過名字自動裝配
  2. 可選屬性
    屬性 說明
    name 屬性的名稱
    value 主要是配置基本類型的屬性值嫩絮,
    ref 但是如果我們需要為Bean設(shè)置屬性值是另一個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屬性實現(xiàn)自動裝配
  2. 可選值
    可選值 說明
    no 不使用自動裝配。Bean的引用必須通過ref元素定義氢伟。
    byName 根據(jù)屬性名自動裝配榜轿。BeanFactory查找容器中的全部Bean幽歼,找出其中id屬性與屬性同名的Bean來完成注入。如果沒有找到匹配的Bean實例谬盐,則Spring不會進行任何注入
    byType 如果BeanFactory中正好有一個同屬性類型一樣的bean甸私,就自動裝配這個屬性。如果有多于一個這樣的bean飞傀,就拋出一個致命異常颠蕴,它指出你可能不能對那個bean使用byType的自動裝配。如果沒有匹配的bean助析,則什么都不會發(fā)生犀被,屬性不會被設(shè)置。如果這是你不想要的情況(什么都不發(fā)生)外冀,通過設(shè)置dependency-check="objects"屬性值來指定在這種情況下應(yīng)該拋出錯誤寡键。
    constructor 這個同byType類似,不過是應(yīng)用于構(gòu)造函數(shù)的參數(shù)雪隧。如果在BeanFactory中不是恰好有一個bean與構(gòu)造函數(shù)參數(shù)相同類型西轩,則一個致命的錯誤會產(chǎn)生。
    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("初始化!");
    } 
    
    根據(jù)屬性名來加載
     <!-- xml配置 -->
    <bean id="application" class="com.wener.example.bean.Application" autowire="byName"/>  
    <bean id="user" class="com.wener.example.bean.User" />  
    
    根據(jù)類型來加載
    <!-- 注意:當一個Bean即使用自動裝配依賴藕畔,又使用ref顯示依賴時,則顯示指定的依賴就會覆蓋自動裝配 -->
    <bean id="user" class="com.wener.example.bean.User" /> 
    <!-- xml代碼 -->
    <bean id="app" class="com.wener.example.bean.Application" autowire="byType"/>
    
    根據(jù)構(gòu)造方法來加載
    // java代碼
    public Application(User user) {
            this.user = user;
    }
    // xml配置
    <bean id="app" class="com.wener.example.bean.Application" autowire="constructor">
    </bean>
    

五庄拇、注入?yún)?shù)值詳解

1注服、說明

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

2屈张、基本類型注入

  1. 概要
    一般是指可用字符串表示的值擒权,這些值可通過 <value>元素標簽進行注入。在默認情況下阁谆,基本數(shù)據(jù)類型及其封裝類碳抄、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 可以引用統(tǒng)一配置文件中或者父容器中的 Bean
    • local 只能引用同一配置文件中的 Bean
    • parent 只能引用父容器中的 Bean
  2. 示例代碼
    見property案例

4贱鄙、內(nèi)部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="內(nèi)部Bean"/>
            </bean>
        </property>
    </bean>
    

5、級聯(lián)設(shè)置屬性

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

6逗宁、list

  1. 說明
    <list> 元素進行裝配映九,然后通過多個 <value> 設(shè)置基本類型的值,也可以使用<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> 元素設(shè)值,只是 entry 包含一個鍵值對的設(shè)置哼拔,也可以使用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設(shè)置基本類型的值,也可以通過 <ref>去引用已經(jīng)定義的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> 元素設(shè)值
  2. 示例代碼
    <property name="array">
        <array>
            <value>1</value>
            <value>2</value>
            <value>3</value>
           <!-- <ref name="user"/> -->
        </array>
    </property>
    

10、properties

  1. 說明
    <properties> 元素進行裝配檬姥,通過多個 <property> 元素設(shè)值曾我,只是 properties 元素有一個必填屬性 key ,然后可以設(shè)置值
  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蛉谜、總結(jié)

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

六、命名空間裝配

1筑辨、概要

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

2幸逆、c

  1. 說明
    命名空間-c屬性名以 “c:” 開頭棍辕,也就是命名空間的前綴,通過構(gòu)造器注入的方式來配置 bean,接下來就是要裝配的構(gòu)造器參數(shù)名
  2. 示例代碼
    <beans 
      ...    
      xmlns:c="http://www.springframework.org/schema/c">
    </beans>
    
    <!-- 未引入之前-->
    <bean id="shop" class="com.wener.example.bean.Shop">
        <!--通過構(gòu)造方法注入-->
        <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> 創(chuàng)建一個 java.util.List 類型的 bean拍顷,其中包含值或引用
    <util:map> 創(chuàng)建一個 java.util.map 類型的 bean抚太,其中包含值或引用
    <util:properties> 創(chuàng)建一個 java.util.Properties 類型的 bean
    <util:property-path> 引用一個 bean 的屬性(或內(nèi)嵌屬性),并將其暴露為 bean
    <util:set> 創(chuàng)建一個 java.util.Set 類型的 bean,其中包含值或引用
    <util:constant> 引用某個類型的 public static 域尿贫,并將其暴露為 bean

5电媳、util:list

  1. 說明
    可以通過util:list來定義一個java.util.List類型的bean,其子元素就是對應(yīng)的List的元素庆亡,其子元素可以是一切可以用來定義對象的元素匾乓,比如value、bean等又谋,
    默認元素的值是String類型拼缝,可以通過value-type屬性指定元素值的類型,比如數(shù)字類型則指定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對應(yīng)屬性名带膀,而<prop>元素中間的文本值則為對應(yīng)的屬性值
    util:properties的內(nèi)容也可以來自一個外部文件,此時可以通過location屬性引用對應(yīng)的外部文件,通過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屬性指定對應(yīng)的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>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剂癌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翰绊,更是在濱河造成了極大的恐慌佩谷,老刑警劉巖旁壮,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谐檀,居然都是意外死亡抡谐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門稚补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來童叠,“玉大人,你說我怎么就攤上這事课幕∠锰常” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵乍惊,是天一觀的道長杜秸。 經(jīng)常有香客問我,道長润绎,這世上最難降的妖魔是什么撬碟? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮莉撇,結(jié)果婚禮上呢蛤,老公的妹妹穿的比我還像新娘。我一直安慰自己棍郎,他們只是感情好其障,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涂佃,像睡著了一般励翼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辜荠,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天汽抚,我揣著相機與錄音,去河邊找鬼伯病。 笑死造烁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的午笛。 我是一名探鬼主播膨蛮,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼季研!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誉察,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤与涡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驼卖,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡氨肌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酌畜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎囚。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥胞,靈堂內(nèi)的尸體忽然破棺而出恳守,到底是詐尸還是另有隱情,我是刑警寧澤贩虾,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布催烘,位于F島的核電站,受9級特大地震影響缎罢,放射性物質(zhì)發(fā)生泄漏伊群。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一策精、第九天 我趴在偏房一處隱蔽的房頂上張望舰始。 院中可真熱鬧,春花似錦咽袜、人聲如沸丸卷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽及老。三九已至,卻和暖如春范抓,著一層夾襖步出監(jiān)牢的瞬間骄恶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工匕垫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僧鲁,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓象泵,卻偏偏與公主長得像寞秃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子偶惠,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361