[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
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)、Spring的Bean管理、Spring屬性注入
以前也學習過Spring框架,不過好久沒用,當時學完也沒做什麼總結,都忘的差不多了,今天再從頭開始學習一遍。無論是SSH還是SSM都離不開Spring,所以Spring還是很重要的,對於一個想要從事JavaEE開發的人,一定要好好學習Spring框架。Spring的學習計劃如下: 第一
Spring的Bean管理(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()