天天看點

Spring基本用法<一>:從Spring起源,bean的建立到IoC/依賴注入基本情況IoC 依賴注入使用Spring 容器Spring容器中的bean

Spring基本用法<一>:從起源到bean的建立

基本情況

Spring為企業應用開發提供了一個輕量級的解決方案。該解決方案包括:基于依賴注入的核心機制(IoC 控制反轉),基于AOP的聲明事務管理,與多種持久層耦合,優秀的前端MVC架構.

Spring架構的組成結構圖:

Spring基本用法&lt;一&gt;:從Spring起源,bean的建立到IoC/依賴注入基本情況IoC 依賴注入使用Spring 容器Spring容器中的bean

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方法。