Spring讀書筆記-----Spring的Bean之設定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讀書筆記-----Spring的Bean之設定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,微服務 一、什麼是微服務 微服務是一種系統架構的設計風格,它主旨在於將一個原本