1. 程式人生 > >Spring讀書筆記-----Spring的Bean之設定Bean值

Spring讀書筆記-----Spring的Bean之設定Bean值

          Java例項的屬性值可以有很多種資料型別、基本型別值、字串型別、java例項甚至其他的Bean例項、java集合、陣列等。所以Spring允許通過如下幾個元素為Bean例項的屬性指定值:

value

ref

bean

list、set、map、props

一、value:設定普通屬性值

<value.../>元素用於指定字串型別、基本型別的屬性值。Spring使用XML解析器來解析出這些資料,然後利用java.beans.PropertyEdior完成型別轉換:從java.lang.String型別轉換為所需的引數值型別。如果目標型別是基本資料型別,通常都是可以正確轉換。

public class ValueTest {
	//定義一個String型屬性
	private String name;
	//定義一個int型屬性
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

上面例項只是演示了注入普通屬性值。在Spring配置檔案中使用<value.../>元素來為這兩個屬性指定屬性值。

<bean id="text" class="com.spring.service.impl.ValueTest">
		<property name="age" value="1" />
		<property name="name" value="chenssy" />
	</bean>

通過上面可以知道<value.../>元素主要用於傳入字串、基本型別的屬性值。

二、ref:配置合作者

<value.../>主要是配置基本型別的屬性值,但是如果我們需要為Bean設定屬性值是另一個Bean例項時,這個時候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下兩個屬性。

bean:引用不在同一份XML配置檔案中的其他Bean例項的id屬性值。

local:引用同一份XML配置檔案中的其他Bean例項的id屬性值。

<bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
	<bean id="chinese" class="com.spring.service.impl.Chinese" >
		<property name="axe">
			<ref local="steelAxe"/>
		</property>
	</bean>

其實Spring提供了一種更加簡潔的寫法:

	<bean id="steelAxe" class="com.spring.service.impl.SteelAce"></bean>
	<bean id="chinese" class="com.spring.service.impl.Chinese" >
		<property name="axe" ref="steelAxe" />
	</bean>

通過property增加ref屬性,一樣可以將另一個Bean的引用設定成axe屬性值。這樣寫的效果和使用<ref.../>屬性一樣,而且不需要區分是使用bean屬性還是local屬性,所以推薦這種寫法。

2.1、使用自動裝配注入合作者bean

Spring支援自動裝配Bean與Bean之間的依賴關係,也就是說我們無需顯示的指定依賴Bean。由BeanFactory檢查XML配置檔案內容,根據某種規則,為主調Bean注入依賴關係。

Spring的自動裝配機制可以通過<bean.../>元素的default-autowire屬性指定,也可以通過<bean.../>元素的autowire屬性指定。

自動裝配可以減少配置檔案的工作量,但是它降低了依賴關係的透明性和清晰性,所以一般來說在較大部署環境中不推薦使用,顯示配置合作者能夠得到更加清晰的依賴關係。Spring提供瞭如下幾種規則來實現自動裝配。

no:不適用自動裝配。Bean依賴必須通過ref元素定義。

byName:根據屬性名自動裝配。BeanFactory查詢容器中的全部Bean,找出其中id屬性與屬性同名的Bean來完成注入。如果沒有找到匹配的Bean例項,則Spring不會進行任何注入。

byType:根據屬性型別自動裝配。BeanFactory查詢容器中的全部Bean,如果正好有一個與依賴屬性型別相同的Bean,就自動注入這個屬性;但是如果有多個這樣的Bean,就會丟擲一個異常。如果沒有匹配的Bean,則什麼都不會發生,屬性就不會被設定。如果需要無法自動裝配時丟擲異常,則設定dependency-check=”objects”。

constructor:與不Type類似,區別是用於構造注入的引數。

Autodetect:BeanFactory根據Bean內部結構,決定使用constructor或者byType。如果找到一個預設的建構函式,則使用byTe。

byName規則

byTyep規則是指通過名字注入依賴關係,假如Bean A的實現類裡面包含setB()方法,而Spring的配置檔案恰好包含一個id為b的Bean,則Spring容器就會將b例項注入Bean A中。如果容器中沒有名字匹配的Bean,Spring則不會做任何事情。

	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName" />
	<bean id="gundog" class="com.spring.service.impl.Gundog">
		<property name="name" value="wangwang" />
	</bean>

上面的配置檔案指定了byName規則。則com.app.service.impl.Chinese類中提供如下的依賴注入方法:

/*
	 * 依賴關係必須的setter方法,因為需要通過名字自動裝配
	 * 所以setter方法必須提供set+Bean名,Bean名的首字母大寫
	 * @param dog 設定的dog值
	 */
	public void setGundog(Dog dog){
		this.dog = dog;
	}

byType規則

byType規則是根據型別匹配注入依賴關係。假如A例項有setB(B b)方法,而Spring配置檔案中恰好有一個型別B的Bean例項,容器為A注入型別匹配的Bean例項。如果容器中存在多個B的例項,則會丟擲異常,如果沒有B例項,則不會發生任何事情。

	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byType" />
	<bean id="gundog" class="com.spring.service.impl.Gundog">
		<property name="name" value="wangwang" />
	</bean>

針對上面的配置檔案Chinese類有如下方法。

/**
	 * 依賴關係必須的setter方法
	 * 因為使用按型別自動裝配,setter方法的引數型別與容器的Bean的型別相同
	 * 程式中的Gundog實現了Dog介面
	 * @param dog傳入的dog物件
	 */
	public void setDog(Dog dog){
		this.dog = dog;
	}

當一個Bean即使用自動裝配依賴,又使用ref顯示依賴時,則顯示指定的依賴就會覆蓋自動裝配。

在預設的情況下,Spring會自動搜尋容器中的全部Bean,並對這些Bean進行判斷,判斷他們是否滿足自動裝配的條件,如果滿足就會將該Bean注入目標Bean例項中。如果我們不想讓Spring搜尋容器中的全部Bean,也就是說,我們需要Spring來判斷哪些Bean需要搜尋,哪些Bean不需要搜尋,這個時候就需要用到autowire-candidate屬性。通過為<bean.../>元素設定autowire-candidate=”false”,即可將該Bean限制在自動裝配範圍之外,容器在查詢自動裝配物件時將不考慮該Bean。

三、Bean:注入巢狀Bean

如果某個Bean所依賴的Bean不想被Spring容器直接訪問,則可以使用巢狀Bean。<bean.../>元素用來定義巢狀Bean,巢狀Bean只對巢狀它的外部Bean有效,Spring容器無法直接訪問巢狀Bean,因此在定義巢狀Bean時是無需指定id屬性的。

	<bean id="chinese" class="com.spring.service.impl.Chinese" autowire="byName">
		<property name="axe">
			<!-- 
				屬性值為巢狀Bean,巢狀Bean不能由Spring容器直接訪問,
				所以巢狀Bean是不需要id屬性
			 -->
			<bean class="com.spring.service.impl.SteelAce" />
		</property>
	</bean>


採用上面的配置可以保證巢狀Bean不能被容器訪問,因此不用擔心其他程式修改巢狀bean。但是巢狀Bean限制了Bean的訪問,提高了程式的內聚性。

四、list、set、map、props

<value.../>元素是注入基本資料型別和String型別的,但是如果某個Bean的屬性是集合呢?這個時候我們就需要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>元素分別用來設定型別list、set、map和Properties的集合屬性值。

先看下面java類:

public class Chinese implements Person{

	//下面是一系列的集合屬性
	private List<String> schools;
	private Map scores;
	private Map<String, Axe> phaseAxes;
	private Properties health;
	private Set axe;
	private String[] books;
	
	public List<String> getSchools() {
		return schools;
	}

	public void setSchools(List<String> schools) {
		this.schools = schools;
	}

	public Map getScores() {
		return scores;
	}

	public void setScores(Map scores) {
		this.scores = scores;
	}

	public Map<String, String> getPhaseAxes() {
		return phaseAxes;
	}

	public void setPhaseAxes(Map<String, String> phaseAxes) {
		this.phaseAxes = phaseAxes;
	}

	public Properties getHealth() {
		return health;
	}

	public void setHealth(Properties health) {
		this.health = health;
	}

	public Set getAxe() {
		return axe;
	}

	public void setAxe(Set axe) {
		this.axe = axe;
	}

	public String[] getBooks() {
		return books;
	}

	public void setBooks(String[] books) {
		this.books = books;
	}

	public void useAxe() {
		
	}

}

 上面的java程式碼中有陣列、list、set、,map、Properties。下面是針對上面的配置檔案。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<!-- 定義一個普通的Axe Bean -->
	<bean id="steelAxe" class="com.spring.service.impl.SteelAxe" />
	<bean id="stoneAxe" class="com.spring.service.impl.StoneAxe" />
	
	<!--定義Chinese Bean -->
	<bean id="chinese" class="com.spring.service.impl.Chinese">
		<property name="schools">
			<list>
				<value>小學</value>
				<value>中學</value>
				<value>大學</value>
			</list>
		</property>
		
		<property name="scores">
			<map>
				<entry key="語文" value="88" />
				<entry key="數學" value="87" />
				<entry key="外語" value="88" />
			</map>
		</property>
		
		<property name="phaseAxes">
			<map>
				<entry key="原始社會" value-ref="stoneAxe" />
				<entry key="農業社會" value-ref="steelAxe" />
			</map>
		</property>
		
		<property name="health">
			<props>
				<prop key="血壓">正常</prop>
				<prop key="身高">175</prop>
			</props>
		</property>
		
		<property name="axe">
			<set>
				<value>普通字串</value>
				<bean class="com.spring.service.impl.SteelAxe"></bean>
				<ref local="stoneAxe"/>
			</set>
		</property>
		
		<property name="books">
			<list>
				<value>java 程式設計思想</value>
				<value>思考致富</value>
				<value>將才</value>
			</list>
		</property>
	</bean>
</beans>

從上面的配置檔案中可以看出,Spring對list屬性和陣列屬性的處理是一樣的。

當我們使用<list.../>、<set.../>、<map.../>等元素配置集合屬性時,我們還需要手動配置集合元素。由於集合元素又可以是基本型別值、引用容器中的其他Bean、巢狀Bean和集合屬性等。所以這些元素又可以接受如下子元素:

value:指定集合元素是基本資料型別或者字元型別值。

          ref:指定集合元素師容器中另一個Bean例項。

bean:指定集合元素是一個巢狀Bean。

list、set、map、props:指定集合元素值又是集合。

讀李剛《輕量級Java EE企業應用實戰》

相關推薦

Spring讀書筆記-----SpringBean設定Bean

          Java例項的屬性值可以有很多種資料型別、基本型別值、字串型別、java例項甚至其他的Bean例項、java集合、陣列等。所以Spring允許通過如下幾個元素為Bean例項的屬性指定值:valuerefbeanlist、set、map、props一、v

Spring 學習筆記(五)—— Bean之間的關系、作用域、自動裝配

mar byname pps etc 有時 sysman 對象實例 構造 encoding 繼承   Spring提供了配置信息的繼承機制,可以通過為<bean>元素指定parent值重用已有的<bean>元素的配置信息。 <?xml

spring學習筆記(3)——bean配置細節註意

collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class

Spring食行記配置bean

ice 小結 類型 eba 重載 context () classpath close 【bean配置】 在XML文件中通過bean節點來配置bean 1 <!-- 2 配置bean 3 class: bean的全類名,通過反射的方式在

JavaScript高階程式設計(讀書筆記函式表示式

定義函式的方式有兩種:一種是函式宣告,另一種就是函式表示式。 函式宣告的一個重要特徵就是函式宣告提升(function declaration hoisting),意思是在執行程式碼前會先讀取函式宣告。 這個例子不會報錯,因為程式碼在執行前會先讀取函式宣告。理解函式提升的關鍵就是區別函式宣告和函式表示式之

JavaScript高階程式設計(讀書筆記BOM

BOM(Browser Object Model)提供了很多物件用於訪問瀏覽器的功能,這些功能與任何網頁內容無關。 8.1 window物件 BOM的核心物件是window,它表示一個瀏覽器例項。在瀏覽器中,window物件有雙重角色,window物件既是JavaScript訪問瀏覽器視窗的一個介面,又是E

Spring使用筆記(一)Bean裝配

Bean裝配 Spring提供了3種裝配機制: 1)隱式的Bean發現機制和自動裝配 2)在Java中進行顯示裝配 3)在XML中進行顯示裝配 一)自動化裝配 1.指定某類為元件類: @Component public class Dog { private String name

Spring學習筆記容器

        老實說樓主也是從今天才開始學習Spring的底層知識,所以很多細節知識樓主也不懂,So從網上get了很多Spring相關的資料作為參考,以下內容是對學習的知識做一個簡單的彙總.   

讀書筆記 - 演算法

1. 最優停止理論 - 如何選擇停止觀望的時機 也就是最優停止問題(源於“祕書問題”),答案很簡單,就是37%(其實是1/e, 35%-40%)。最優停止問題有男性選擇約會物件、女性挑選求婚者、租房等。 在所有的最優停止問題中,最大的難點不在於選擇哪一種可選方案,而是確定自己需要考慮多少種方案。 遵循這

Spring 學習筆記(二)- Bean 的配置

# 概要 IOC & DI 概述 配置 bean 配置形式:基於 XML 檔案的方式;基於註解的方式 Bean 的配置方式:通過全類名(反射)、通過工廠方法(靜態工廠方法 & 例項工廠方法)、FactoryBean IOC 容器 Bean

《設計模式禪》讀書筆記(五)代理模式

1. 代理模式的定義和應用 1.1 代理模式的定義 Provide a surrogate or placeholder for another object to control access to it .(為其他物件提供一種代理以控制對這個物件的訪

Effective C++讀書筆記----構造/析構/賦運算

對於一個空類,編譯器會自動建立建構函式、拷貝建構函式、賦值運算子過載以及解構函式。(當然只有在這些函式在被呼叫的時候才會被編譯器創建出來)如果我們在類中顯示的聲明瞭這些函式,編譯器將不再自動生成這些函式。 當類的成員變數中有引用型別或者有const修飾,編譯器不會為該類生成賦值運算子過載函式,儘管該類並沒有

Linux系統優化設定swappiness提高MySQL查詢效能

對MySQL來說,作業系統層面的優化也可以值得考慮一下:就是swappiness。 swappiness的大小主要對如何使用swap分割槽有著密切的聯絡。 來看一下: [[email protected] ~]# cat /proc/sys/vm/swappiness 60 這個

Spring系列筆記(一)--Bean裝載

         Spring框架體系最基礎的功能依賴注入和AOP,首先根據框架的執行順序,介紹一下使用Spring框架時,例項的裝載過程。一、解析配置檔案        Spring通過配置檔案的形式將業務系統中複雜的例項組合、頻繁的例項建立、公共功能抽象等封裝出來,又容器

3、Spring原始碼分析3載入Bean

1、Bean的載入 // 前面兩篇已經分析了讀取配置檔案,並註冊BeanDefinition BeanFactory bf = n

讀書筆記sql server2012數據庫重啟後自增ID跳躍1000的解決方法

sql server2012 數據庫 重啟跳躍1000 解決方法 今天遇到的問題是:讀書筆記之sql server2012數據庫重啟後自增ID值跳躍1000的難題,這個問題經過測試並沒有完全解決,非常遺憾!博客實戰:(讀後感http://www.simayi.net讀書筆記),專註於讀書筆記與

讀書筆記 Spring In Action 4th 第一章 Spring

裝配 遍布 模塊化 處的 nfa cati const mar 驗證 第一章的主要內容介紹 Spring的bean容器 介紹Spring的核心模塊 更為強大的Spring生態系統 Spring的新功能 Tips: POJO的內在含義是指那些沒有從任何類繼承、也沒有

Spring Cloud微服務實戰》讀書筆記客戶端負載均衡:Spring Cloud Ribbon - 4

摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網路壓力、處理能力擴容的重要手段之一。通常

讀書筆記Spring實戰

《Spring實戰(第3版)》 第1章 (個人覺得可以忽略) 第2章 裝配Bean 1、宣告Bean 1)使用一個或多個XML檔案作為配置檔案; 普通spring配置檔案模板:

Spring Cloud微服務實戰》讀書筆記基礎知識1

摘要 微服務是一種系統架構的設計風格,它主旨在於將一個原本獨立的系統,拆分成多個獨立執行的小型服務。不同服務之間通過Restful介面進行通訊協作。 關鍵詞:Spring Cloud,微服務 一、什麼是微服務 微服務是一種系統架構的設計風格,它主旨在於將一個原本