Spring基本用法:從Spring起源,bean的創建到IoC/依賴注入


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實例遍歷方法。主要的篩選方法有

  1. no,不進行篩選,即不使用自動裝配,所有的依賴注入都通過ref標明
  2. byName,根據setter方法進行自動裝配。去掉setter方法的“set”後作爲篩選exp,去匹配容器中的其他bean
  3. byType,跟你講setter的形參類型自動裝配。如果有多個相同類型的bean實例,則拋出異常。如果未檢測到相同類型的bean實例,則不進行注入
  4. contrutor,與byType類似。區別是contrutor應用於構造器函數的參數匹配
  5. 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方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章