1. 程式人生 > >[Spring] 注入Bean屬性

[Spring] 注入Bean屬性

通常,JavaBean的屬性是私有的,同時擁有一組存取器方法,setXXX()和getXXX()形式存在。Spring可以藉助屬性的set方法來配置屬性的值,以實現setter方式的注入。

Kenny是一個很有天賦的樂曲演奏家,由Intrumentalist類定義,如下:

package com.springinaction.springidol;

public class Instrumentalist implements Performer {
    public Instrumentalist() {}

    public void perform() throws PerformanceException {
        System.out.println("Playing "
+ song + " : "); instrument.play(); } private String song; public void setSong(String song) { this.song = song; } public String getSong() { return song; } public String screamSong() { return song; } private Instrument instrument; public
void setInstrument(Instrument instrument) { this.instrument = instrument; } }

Instrument介面定義如下:

package com.springinaction.springidol;

public interface Instrument {
    void play();
}

1 注入簡單值

在spring中可以使用<property>元素配置bean的屬性,如下例子展示了kenny bean的配置:

<bean id="kenny" class
="com.springinaction.springidol.Instrumentalist"> <property name="song" value="Jingle Bells" /> </bean>

2 引入其他Bean

Kenny是一個天才的演奏家,他可以演奏任何樂器,只要這個樂器實現了Instrument介面,定義一個樂器類Saxophone:

package com.springinaction.springidol;

public class Saxophone implements Instrument {
    public Saxophone() {}

    public void play() {
        System.out.println("TOOT TOOT TOOT");
    }
}

在Kenny演奏薩克斯之前,我們現在spring中將它宣告為一個bean,如下所示:

<bean id="saxophone" class="com.springinaction.springidol.Saxophone" />

宣告之後就可以把它賦給Kenny演奏了,我們對Kenny的配置做如下修改:

<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
       <property name="song" value="Jingle Bells" />
       <property name="instrument" ref="saxophone" />
</bean>

下面我們可以執行如下程式碼讓Kenny表演:

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-idol.xml");
Performer performer = (Performer)ctx.getBean("kenny");
performer.perform();

輸出結果為:

Playing Jingle Bells :
TOOT TOOT TOOT

注入內部bean
內部bean是定義在其他bean內部的bean,如下配置將薩克斯宣告為內部bean:

<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
       <property name="song" value="Jingle Bells" />
       <property name="instrument">
              <bean class="com.springinaction.springidol.Saxophone" />
       </property>
</bean>

內部bean並不僅限於setter注入,我們還可以把內部bean裝配到構造方法的入參中,正如下面的duke的新宣告所展示的:

<bean id="duke" class="com.springinaction.springidol.PoeticJuggler">
       <constructor-arg value="25" />
       <constructor-arg>
              <bean class="com.springinaction.springidol.Sonnet29" />
       </constructor-arg>
</bean>

內部bean沒有ID屬性,雖然為內部bean配置一個ID屬性完全是合法的,但是卻沒有必要。內部類最大的缺點:不能被複用。內部bean僅適用於一次注入,而且也不能被其他bean應用。使用內部bean會影響Spring XML配置的可讀性。

3 使用spring的名稱空間p裝配屬性

spring的名稱空間p提供了另一種bean屬性的裝配方式,該方式不需要配置如此多的尖括號。
名稱空間p的schema URI為http://www.springframework.org/schema/p。如果你想使用名稱空間p,主需要在spring的XML配置中增加如下一段宣告:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd">

使用範例如下:

<bean id="kenny2" class="com.springinaction.springidol.Instrumentalist"
    p:song="Jingle Bells"
    p:instrument-ref="saxophone" />

-ref字尾作為一個標識來告知spring應該裝配一個引用而不是字面值。

4 裝配集合

當配置集合型別的bean屬性時,spring提供了4種類型的集合配置元素。

集合元素 用途
<list> 裝配list型別的值,允許重複
<set> 裝配set型別的值,不允許重複
<map> 裝配map型別的值,名稱和值可以是任意型別
<props> 裝配properties型別的值,名稱和值必須是String型別

當屬性為任意的java.util.Collection型別時,<list><set>幾乎可以完全互換。
<map><props>這兩個元素分別對應java.util.Map和java.util.Properties。當我們需要由鍵-值對組成的集合時,這兩種配置元素非常有用。

Hank能夠同時演奏多種樂器,由類OneManBand定義:

package com.springinaction.springidol;

import java.util.Collection;

public class OneManBand implements Performer {
    public OneManBand() {}

    public void perform() throws PerformanceException {
        for (Instrument instrument : instruments) {
            instrument.play();
        }
    }

    private Collection<Instrument> instruments;

    public void setInstruments(Collection<Instrument> instruments) {
        this.instruments = instruments;
    }
}

我們使用list配置元素為Hank賦予表演時所用到的樂器集合:

<bean id="hank" class="com.springinaction.springidol.OneManBand">
       <property name="instruments">
              <list>
                     <ref bean="guitar" />
                     <ref bean="cymbal" />
                     <ref bean="harmonica" />
              </list>
       </property>
</bean>

list元素包含一個或多個值,這裡的ref元素用來定義在spring上下文中的其他bean引用。當然還可以使用其他的spring設定元素作為list的成員,包括<vaue><bean><null>。實際上,list可以包含另一個list作為其成員,形成多維列表。

Note:無論<list>還是<set>,都可以用來裝配型別為java.util.Collection的任意實現或者陣列的屬性。

裝配Map集合
當OneManBand表演時,假設我們還想知道每一個音符是由哪種樂器產生的,OneManBand可以調整如下:

package com.springinaction.springidol;

import java.util.Collection;
import java.util.Map;

public class OneManBand implements Performer {
    public OneManBand() {}

    public void perform() throws PerformanceException {
        for (String key : instruments.keySet()) {
            System.out.println(key + ":");
            Instrument instrument = instruments.get(key);
            instrument.play();
        }
    }

    private Map<String, Instrument> instruments;

    public void setInstruments(Map<String, Instrument> instruments) {
        this.instruments = instruments;
    }
}

使用map元素配置instruments屬性,如下所示:

<bean id="hank" class="com.springinaction.springidol.OneManBand">
       <property name="instruments">
              <map>
                     <entry key="GUITAR" value-ref="guitar" />
                     <entry key="CYMBAL" value-ref="cymbal" />
                     <entry key="HARMONICA" value-ref="harmonica" />
              </map>
       </property>
</bean>

map中的entry元素由一個鍵和一個值組成,鍵和值可以是簡單型別,也可以是其他型別的引用,這些屬性將幫助我們指定entry的鍵和值:

屬性 用途
key 指定map中entry的鍵為String
key-ref 指定map中entry的鍵為spring上下文中其他bean的引用
value 指定map中entry的值為String
value-ref 指定map中entry的值為spring上下文中其他bean的引用

裝配Properties集合
一個範例如下:

<bean id="hank" class="com.springinaction.springidol.XXX">
<property name="instruments">
       <props>
              <prop key="GUITAR">STRUM STRUM STRUM</prop>
              <prop key="CYMBAL">CRASH CRASH CRASH</prop>
              <prop key="HARMONICA">HUM HUM HUM</prop>
       </props>
</property>
</bean>

Note:術語比較

  • <property>元素用於把值或bean引用注入到bean的屬性中
  • <props>元素用於定義一個java.util.Properties型別的集合值
  • <prop>元素用於定義<props>集合的一個成員。

5 裝配空值

通常情況下bean屬性的最初值都是null,直到你為它賦值,但是有些bean會為它的屬性預設設定一個非空值。如果因為某些特殊原因,必須把屬性設定為空值,則可以顯式地為該屬性裝配一個null值。
為屬性設定null值,只需使用<null/>元素,例如:

<property name="someNonNullProperty"><null/></property>

顯式地為屬性裝配null值的另一個理由是覆蓋自動裝配的值。

相關推薦

[Spring] 注入Bean屬性

通常,JavaBean的屬性是私有的,同時擁有一組存取器方法,setXXX()和getXXX()形式存在。Spring可以藉助屬性的set方法來配置屬性的值,以實現setter方式的注入。 Kenny是一個很有天賦的樂曲演奏家,由Intrumentalist類

Spring XML配置注入Bean屬性舉例

Spring <Map>元素用來儲存多個鍵值對屬性,型別為java.util.Map;他的子標籤<entry>用來定義Map中的鍵值實體,下面舉例說明; Article.java 這個article class有一個屬性是作者聯名資訊,使用序號

spring注入bean兩種方式(屬性注入,構造器注入

利用Spring的IOC實現簡單小程式,Spring推薦介面程式設計,這裡定義兩個介面:IDao,IService,以及它們的實現類IDaoImpl,IServiceImpl,程式碼如下: package DAO; public interface IDao {public

Spring注入Bean的幾種方式

首先,Bean的概念需要清晰: Bean是一種符合一定要求的Java類 1 有預設的建構函式 2 對於私有屬性,有setter和getter 滿足了上述的條件,在工程中就可以在XML檔案中定義類的例項。一開始我不是很理解,為什麼要在XML中去定義例項,而不是正正常常的程式碼中建立。

spring注入bean的三種方式

1、自動化裝配bean 元件裝配:Spring會自動發現應用上下文所建立的bean。 自動裝配:Spring自動滿足bean之間的依賴 在類上加入@Component註解,告訴spring為這個類建立bean 使用@Autowired註解實現自動裝配,也可以使用java規範的@Inj

Spring注入bean報錯 Error creating bean with name的網上找不到的解決方案

                        今天在研究Bas

06--Spring注入集合屬性

Spring的依賴注入方式大體上可以分為三種: 建構函式注入 Setter方法注入 方法注入 (lookup-method注入和replace-method注入) 建構函式注入可參考 04–Spring例項化Bean的三種方式 ,本篇介紹通過Setter方法

記錄一次Spring注入Bean失敗的問題

最近剛進入一個新的公司,發現每個表的欄位好多,且沒有自動生成程式碼工具,每天都在複製貼上欄位上浪費好多時間,就決定寫一個自動生成程式碼的小工具。 當然,工具程式碼網上好多,基本上都是使用FreeMarker模板生成,我只是想記錄一下中間實現的最大問題,資料來源的

spring 注入properties屬性,動態切換測試與生成環境

1.準備檔案test.properties api_query_nurses_by_page=http://test-jkda.998jk.com//admin/jkda/queryNursesPage.json api_query_nurses_by_ids=http:

Spring注入Bean的幾種方式 @Import,ImportSelector,ImportBeanDefinitionRegistrar的詳解

給容器中註冊元件;    1,包掃描+元件標註註解(@Controller/@Service/@Repository/@Component)[自己寫的類]    2,@Bean[匯入的第三方包裡面的元件]    3,@Import[快速給容器中匯入一個元件]      

spring 注入static屬性

網上好多方法都是錯誤的,google之,發現 http://stackoverflow.com/questions/11324372/how-to-make-spring-inject-value-into-a-static-field 寫道 You have two possibilities: In t

啟動tomcat時候,Spring注入bean報錯:Error creating bean with name

當遇到這種問題的時候,本能的反應就是是不是沒有掃描到該bean物件,該bean物件有沒有加註解。 而網上的普遍解決方案一般都是說spring配置檔案有問題,掃描不到該包;還有一些解決方案比較細節,不具有概括性,比如component元件的類用抽象類(眾所周知,抽象類無法例項

spring 注入properties屬性亂碼問題

使用Spring註解方式注入properties檔案內容,並配合Junit4+Spring做單元測試 先看看工作目錄,然後再來講解 1、建立config.properties,我的config.properties內容如下: author_name=luo

main方法中呼叫spring注入bean

public static void main(String[] args) {  // TODO Auto-generated method stub  ApplicationContext context = new ClassPathXmlApplicationCont

Spring第一天:Spring的概述、SpringIOC入門(XML)、SpringBean管理、Spring屬性注入

以前也學習過Spring框架,不過好久沒用,當時學完也沒做什麼總結,都忘的差不多了,今天再從頭開始學習一遍。無論是SSH還是SSM都離不開Spring,所以Spring還是很重要的,對於一個想要從事JavaEE開發的人,一定要好好學習Spring框架。Spring的學習計劃如下: 第一

SpringBean管理(XML方式)&屬性注入

1、Spring對Bean的例項化方式 Bean已經都交給Spring進行管理,Spring在建立這些類的時候,有三種方式 1.1 無參構造方法的方式(預設) 編寫類 public class Bean1{ public void Bean1(){ super();

Spring 中如何向 Bean 注入系統屬性或環境變數

在 Spring 中為 javabean 注入屬性檔案中的屬性值一般人都知道的,可以通過 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 引入一個屬性檔案,然後給 bean 指定

spring ioc中例項化bean以及依賴注入bean和基本型別屬性簡單實現方案

Spring兩個重要特性IOC和AOP,本文中簡單實現bean的建立以及屬性依賴注入。 實現步驟如下: 1、通過dom4j解析bean.xml檔案,將bean物件以及依賴屬性裝入List。 2、遍歷list,通過反射機制例項化物件。 3、遍歷list,通過反射呼叫bean裡

spring注入引數(bean物件中又有bean屬性),beans.xml配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.o

Spring Bean屬性注入原理只需setXxx()方法,無需屬性

package top.chgl16.springStudy3.letter; /** * @Lin * 測試 注入是否需要屬性,還是隻需要setName方法 * 結果:只需要setName()