Spring基本用法<一>:從起源到bean的建立
基本情況
Spring為企業應用開發提供了一個輕量級的解決方案。該解決方案包括:基于依賴注入的核心機制(IoC 控制反轉),基于AOP的聲明事務管理,與多種持久層耦合,優秀的前端MVC架構.
Spring架構的組成結構圖:

Core Container部分是Spring的核心機制,為必不可少的。其他部分包括:JDBC,ORM,WEB,STRUTS都是可選的。從這也不難看出Spring是一個既可以提供一站式解決方案的架構,也是一個可以選擇使用其中部分功能的架構,它保證了良好的子產品化。
IoC 依賴注入
類間方法的互相調用有一個明顯的曆史演變過程。
直接在調用方中建立被調用對象,來擷取方法—->調用者找到被調用者的工廠,依賴抽象的工廠接口來獲得對象和方法—->調用者不再主動建立被調用的對象,而被是被動的接受Spring架構将需要的對象注入到調用者中
Spring架構将調用者擷取被依賴對象的方式,由主動擷取變為被動接受,這就是IoC 控制反轉
從Spring的角度看,Spring負責将被依賴對象的執行個體指派到調用者中,相當于為調用者注入它需要的執行個體,是以這種方式被稱為依賴注入。
設值注入
通過在調用者中建立一個setter方法,用來傳入被調用者的執行個體
bean文法
構造注入
通過在調用者的構造函數中傳入被調用者的執行個體
bean文法
兩種注入方式的比較:設值注入更容易了解,而且不會因為傳入執行個體過多而使得函數臃腫,甚至導緻性能下降;
構造注入可以決定依賴關系的注入順序,無需擔心對後面代碼的破壞。建議采用設定為主構造為輔的政策。
使用Spring 容器
Spring的兩個核心接口BeanFactory 和 ApplicationContext都可以建立容器并管理bean,但是大部分時候都不會把BeanFactory作為容器,原因是後者除了提供前者全部的功能外,還額外提供:
1.預設預初始化所有的singletion bean,當然也可以取消
2.它繼承了MessagerSource接口,提供國際化支援
3.資源通路機制,比如URL和檔案
4.事件機制:按照觀察者模式設計,通過實作ApplicationEvent和ApplicationListener接口實作事件處理
5.同時加載多個配置檔案
6.以聲明式的方式啟動被建立Spring容器
為了讓bean擷取Spring容器,可以讓bean實作setBeanFactory接口
Spring容器中的bean
對于開發者來說,使用Spring架構主要幹兩件事。1.開發bean 2.配置bean
beans
了解beans根元素下不同屬性的功能,包括:
default-lazy-init 延遲初始化,
default-merge 指定所有bean的預設行為 ,
default-autowire指定根元素下所有bean預設的裝配行為,
default-autowire-candidates指定該元素配置下的所有bean預設是否作為自動轉配的候選bean
default-init-method 指定所有bean的初始化方法
default-destory-method 指定所有bean的回收方法
bean
id:确定該bean在容器中的唯一辨別
class:該類的完整限定名
name:指定名稱/alias指定别名
bean的作用域
Spring支援:singleton prototype request seesion global session五個作用域,預設為singleton,即每個類在同一個容器中隻建立一個執行個體,prototype指定每次都會建立一個新的執行個體,其他作用域依據名稱可以判斷
配置依賴
Spring允許通過如下元素為setter方法,構造器指定參數
value ref map props/list/set/map分别代表了bean類的四種成員變量,注入參數值根據各種類型的不同而有不同bean配置模式。
設定普通屬性值
注入普通屬性值,包括所有的基本類型和包裝類
<bean id="id" class="...">
<property name="類成員變量名" value=“希望注入的值x”/>
<property name="類成員變量名" value=“希望注入的值x”/>
</bean>
設定其他執行個體屬性值
注入的屬性值是容器中另外一個bean執行個體
<bean id="steelshit" class="bulabula"/>
<bean id="id" class="...">
<property name="被調用類成員的執行個體名" ref=“steelshit”/>
</bean>
使用自動裝配注入合作者bean
自動裝配可以直覺的了解為:一種持有特定篩選對象和篩選函數的全容器bean執行個體周遊方法。主要的篩選方法有
- no,不進行篩選,即不使用自動裝配,所有的依賴注入都通過ref标明
- byName,根據setter方法進行自動裝配。去掉setter方法的“set”後作為篩選exp,去比對容器中的其他bean
- byType,跟你講setter的形參類型自動裝配。如果有多個相同類型的bean執行個體,則抛出異常。如果未檢測到相同類型的bean執行個體,則不進行注入
- contrutor,與byType類似。差別是contrutor應用于構造器函數的參數比對
- autodetecet,Spring根據bean的内部結構自行決定使用byType或者constructor
注入嵌套bean
如果某個bean依賴的bean不想被Spring容器所通路(可能是有bean),可以把這個bean隐藏在property中
<bean id="id" class="...">
<property name="被調用類成員的執行個體名">
<bean class="">
</property>
</bean>
注入集合值
list set map 和 property都有自己的對應的bean文法
list
<bean id="id" class="...">
<property name="list/set">
<list/set>
<value>國小</value>
<value>中學</value>
<value>大學學</value>
</list/set>
</property>
</bean>
property
<bean id="id" class="...">
<property name="somthing">
<props>
<props key="王者榮耀">國小</props>
<props key="穿越火線">中學</props>
<props key="風暴英雄">大學學</props>
</props>
</property>
</bean>
map
<bean id="id" class="...">
<property name="somethingaboutthismap">
<map>
<entry key="王者榮耀" value="國小"></props>
<entry key="穿越火線" value="中學"></props>
<entry key="風暴英雄" ref- value="大學學"></props>
</map>
</property>
</bean>
javabean和Springbean的差別
javabean主要作為DTO,永磊封裝值對象,在各層之間實作資料傳輸(例如和持久層互動的dao)而Spring中的bean泛指所有位于Spring容器中的對象執行個體。javabean要求為所有的成員變量提供set和get方法,而Spring中的bean并不要求一定要為所有的成員變量提供set和get方法。