Spring的IOC容器使用方法(配置bean)

因爲最近疫情在家,家裏又沒有相關的書籍,所以只能通過網上的教學視頻來學習相關技術。但是,看視頻只是快速入門的好方法,並不能做到對技術的深入理解,要深入理解還是要看書。因此,本文就是對於如何使用Spring框架的介紹,說得比較淺顯,深入的內容不多。

首先,說一下什麼是Spring。

Spring 是什麼

Spring 是一個開源框架.
Spring 爲簡化企業級應用開發而生. 使用 Spring 可以使簡單的 JavaBean 實現以前只有 EJB 才能實現的功能.
Spring 是一個 IOC(DI) AOP 容器框架.
具體描述 Spring:
輕量級Spring 是非侵入性- 基於 Spring 開發的應用中的對象可以不依賴於 Spring API
依賴注入(DI --- dependency injectionIOC)
面向切面編程(AOP --- aspect oriented programming)
容器: Spring 是一個容器, 因爲它包含並且管理應用對象的生命週期
框架: Spring 實現了使用簡單的組件配置組合成一個複雜的應用. Spring 中可以使用 XML Java 註解組合這些對象
一站:在 IOC AOP 的基礎上可以整合各種企業應用的開源框架和優秀的第三方類庫 (實際上 Spring 自身也提供了展現層的 SpringMVC 和 持久層的 Spring JDBC

 

Spring 模塊

 

 IOC DI

 •IOC(Inversion of Control):其思想是反轉資源獲取的方向. 傳統的資源查找方式要求組件向容器發起請求查找資源. 作爲迴應, 容器適時的返回資源. 而應用了 IOC 之後, 則是容器主動地將資源推送給它所管理的組件, 組件所要做的僅是選擇一種合適的方式來接受資源. 這種行爲也被稱爲查找的被動形式。

DI(Dependency Injection) IOC 的另一種表述方式:即組件以一些預先定義好的方式(例如: setter 方法)接受來自如容器的資源注入. 相對於 IOC 而言,這種表述更直接。

 Spring 容器

Spring IOC 容器讀取 Bean 配置創建 Bean 實例之前, 必須對它進行實例化. 只有在容器實例化後, 纔可以從 IOC 容器裏獲取 Bean 實例並使用.
Spring 提供了兩種類型的 IOC 容器實現:
BeanFactory: IOC 容器的基本實現.
ApplicationContext: 提供了更多的高級特性. BeanFactory 的子接口.
BeanFactory Spring 框架的基礎設施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的開發者,幾乎所有的應用場合都直接使用 ApplicationContext 而非底層的 BeanFactory
無論使用何種方式, 配置文件時相同的.

 ApplicationContext

ApplicationContext 的主要實現類:
ClassPathXmlApplicationContext類路徑下加載配置文件
FileSystemXmlApplicationContext: 從文件系統中加載配置文件
ConfigurableApplicationContext 擴展於 ApplicationContext,新增加兩個主要方法:refresh() close(), 讓 ApplicationContext 具有啓動、刷新和關閉上下文的能力。
ApplicationContext 在初始化上下文時就實例化所有單例的 Bean
WebApplicationContext 是專門爲 WEB 應用而準備的,它允許從相對於 WEB 根目錄的路徑中完成初始化工作。

 

 

基於XML文件的方式配置Bean(有些我感覺太細節,我就不寫了)

配置 bean,下面這些是配置Bean的內容目錄:
配置形式:基於 XML 文件的方式;基於註解的方式
Bean 的配置方式:通過全類名(反射)、通過工廠方法(靜態工廠方法 & 實例工廠方法)、FactoryBean
IOC 容器 BeanFactory & ApplicationContext 概述
依賴注入的方式:屬性注入;構造器注入
注入屬性值細節
自動轉配
bean 之間的關係:繼承;依賴
bean 的作用域:singletonprototypeWEB 環境作用域
使用外部屬性文件
spEL
IOC 容器中 Bean 的生命週期
Spring 4.x 新特性:泛型依賴注入

 •xml 文件中通過 bean 節點來配置 bean

idBean 的名稱。

IOC 容器中必須是唯一的
id 沒有指定,Spring 自動將權限定性類名作爲 Bean 名字
id 可以指定多個名字,名字之間可用逗號、分號、或空格分隔

 

 依賴注入的方式

Spring 支持 3 種依賴注入的方式
屬性注入
構造器注入
工廠方法注入(很少使用,不推薦)

 

 屬性注入

屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的對象
屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值
屬性注入是實際應用中最常用的注入方式

 

 構造方法注入

通過構造方法注入Bean 的屬性值或依賴的對象,它保證了 Bean 實例在實例化後就可以使用。
構造器注入在 <constructor-arg> 元素裏聲明屬性, <constructor-arg> 中沒有 name 屬性

        •按索引匹配入參:

                                                            

        •按類型匹配入參:

 

       

 引用其它 Bean

組成應用程序的 Bean 經常需要相互協作以完成應用程序的功能. 使 Bean 能夠相互訪問, 就必須在 Bean 配置文件中指定對 Bean 的引用
Bean 的配置文件中, 可以通過 <ref> 元素或 ref  屬性Bean 的屬性或構造器參數指定對 Bean 的引用.
也可以在屬性或構造器裏包含 Bean 的聲明, 這樣的 Bean 稱爲內部 Bean

 

 XML 配置裏的 Bean 自動裝配(注意,這裏是XML配置方式的自動裝配,與註解的方式是不同的)

Spring IOC 容器可以自動裝配 Bean. 需要做的僅僅是<bean> autowire 屬性裏指定自動裝配的模式
byType(根據類型自動裝配): IOC 容器中有多個與目標 Bean 類型一致的 Bean. 在這種情況下, Spring 將無法判定哪個 Bean 最合適該屬性, 所以不能執行自動裝配.
byName(根據名稱自動裝配): 必須將目標 Bean 的名稱和屬性名設置的完全相同.
constructor(通過構造器自動裝配): Bean 中存在多個構造器時, 此種自動裝配方式將會很複雜. 不推薦使用

 XML 配置裏的 Bean 自動裝配的缺點

Bean 配置文件裏設置 autowire 屬性進行自動裝配將會裝配 Bean 的所有屬性. 然而, 若只希望裝配個別屬性時, autowire 屬性就不夠靈活了.
autowire 屬性要麼根據類型自動裝配, 要麼根據名稱自動裝配, 不能兩者兼而有之.
一般情況下,在實際的項目中很少使用自動裝配功能,因爲和自動裝配功能所帶來的好處比起來,明確清晰的配置文檔更有說服力一些

 繼承 Bean 配置

Spring 允許繼承 bean 的配置, 被繼承的 bean 稱爲父 bean. 繼承這個父 Bean Bean 稱爲子 Bean
Bean 從父 Bean 中繼承配置, 包括 Bean 屬性配置
Bean 也可以覆蓋從父 Bean 繼承過來的配置
Bean 可以作爲配置模板, 也可以作爲 Bean 實例. 若只想把父 Bean 作爲模板, 可以設置 <bean> abstract 屬性爲 true, 這樣 Spring 將不會實例化這個 Bean
並不是 <bean> 元素裏的所有屬性都會被繼承. 比如: autowire, abstract .
可以忽略父 Bean class 屬性, 讓子 Bean 指定自己的類, 而共享相同的屬性配置. 但此時 abstract 必須設爲 true

 依賴 Bean 配置

Spring 允許用戶通過 depends-on 屬性設定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 實例化之前創建好
如果前置依賴於多個 Bean,則可以通過逗號,空格或的方式配置 Bean 的名稱

 Bean 的作用域(比較重要)

Spring , 可以在 <bean> 元素的 scope 屬性裏設置 Bean 的作用域.
默認情況下, Spring 只爲每個在 IOC 容器裏聲明的 Bean 創建唯一一個實例, 整個 IOC 容器範圍內都能共享該實例所有後續的 getBean() 調用和 Bean 引用都將返回這個唯一的 Bean 實例.該作用域被稱爲 singleton, 它是所有 Bean 的默認作用域.

 

 使用外部屬性文件

配置文件裏配置 Bean , 有時需要在 Bean 的配置裏混入系統部署的細節信息(例如: 文件路徑, 數據源配置信息等). 而這些部署細節實際上需要和 Bean 配置相分離
Spring 提供了一個 PropertyPlaceholderConfigurer BeanFactory 後置處理器, 這個處理器允許用戶將 Bean 配置的部分內容外移到屬性文件. 可以在 Bean 配置文件裏使用形式爲 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 並使用這些屬性來替換變量.
Spring 還允許在屬性文件中使用 ${propName},以實現屬性之間的相互引用。

 

 

 SpEL就不寫了,太細節了。。。

 IOC 容器中 Bean 生命週期方法(比較重要)

Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務.
Spring IOC 容器對 Bean 的生命週期進行管理的過程:
通過構造器或工廠方法創建 Bean 實例
Bean 的屬性設置值和對其他 Bean 的引用
調用 Bean 的初始化方法
Bean 可以使用了
當容器關閉時, 調用 Bean 的銷燬方法
Bean 的聲明裏設置 init-method destroy-method 屬性, Bean 指定初始化和銷燬方法.

 

創建 Bean 後置處理器

Bean 後置處理器允許在調用初始化方法前後對 Bean 進行額外的處理.
Bean 後置處理器對 IOC 容器裏的所有 Bean 實例逐一處理, 而非單一實例. 其典型應用是: 檢查 Bean 屬性的正確性或根據特定的標準更改 Bean 的屬性.
Bean 後置處理器而言, 需要實現BeanPostProcessor接口. 在初始化方法被調用前後, Spring 將把每個 Bean 實例分別傳遞給上述接口的以下兩個方法:
 
 

添加 Bean 後置處理器後 Bean 的生命週期 

Spring IOC 容器對 Bean 的生命週期進行管理的過程:
通過構造器或工廠方法創建 Bean 實例
Bean 的屬性設置值和對其他 Bean 的引用
Bean 實例傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法
調用 Bean 的初始化方法
Bean 實例傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法
Bean 可以使用了
當容器關閉時, 調用 Bean 的銷燬方法 

  

 通過靜態工廠方法、實例工廠方法和FactoryBean等方法進行Bean配置就不寫了,要用就去查吧。。。

基於註解的方式(基於註解配置 Bean,基於註解來裝配 Bean 的屬性)--重點

 classpath 中掃描組件

組件掃描(component scanning):  Spring 能夠classpath 下自動掃描, 偵測和實例化具有特定註解的組件.
特定組件包括:
@Component: 基本註解, 標識了一個受 Spring 管理的組件
@Respository: 標識持久層組件
@Service: 標識服務層(業務層)組件
@Controller: 標識表現層組件
對於掃描到的組件, Spring 有默認的命名策略: 使用非限定類名, 第一個字母小寫. 也可以在註解中通過 value 屬性值標識組件的名稱。
當在組件類上使用了特定的註解之後, 還需要在 Spring 的配置文件中聲明 <context:component-scan>
base-package 屬性指定一個需要掃描的基類包Spring 容器將會掃描這個基類包裏及其子包中的所有類.
當需要掃描多個包時, 可以使用逗號分隔.
如果僅希望掃描特定的類而非基包下的所有類,可使用 resource-pattern 屬性過濾特定的類,示例:

         

<context:include-filter> 子節點表示要包含的目標類
<context:exclude-filter> 子節點表示要排除在外的目標
<context:component-scan> 下可以擁有若干個 <context:include-filter> <context:exclude-filter> 子節點

          •<context:include-filter> <context:exclude-filter> 節點支持多種類型的過濾表達式: 

組件裝配 

 •<context:component-scan> 元素還會自動註冊 AutowiredAnnotationBeanPostProcessor 實例, 該實例可以自動裝配具有 @Autowired @Resource @Inject註解的屬性.

使用 @Autowired 自動裝配 Bean 

@Autowired 註解自動裝配具有兼容類型的單個 Bean屬性
構造器, 普通字段(即使是非 public), 一切具有參數的方法都可以應用@Authwired 註解
默認情況下, 所有使用 @Authwired 註解的屬性都需要被設置. Spring 找不到匹配的 Bean 裝配屬性時, 會拋出異常, 若某一屬性允許不被設置, 可以設置 @Authwired 註解的 required 屬性爲 false
默認情況下, IOC 容器裏存在多個類型兼容的 Bean , 通過類型的自動裝配將無法工作. 此時可以在 @Qualifier 註解裏提供 Bean 的名稱. Spring 允許對方法的入參標註 @Qualifiter 已指定注入 Bean 的名稱
@Authwired 註解也可以應用在數組類型的屬性上, 此時 Spring 將會把所有匹配的 Bean 進行自動裝配.
@Authwired 註解也可以應用在集合屬性, 此時 Spring 讀取該集合的類型信息, 然後自動裝配所有與之兼容的 Bean.
@Authwired 註解用java.util.Map 上時, 若該 Map 的鍵值爲 String, 那麼 Spring 將自動裝配與之 Map 值類型兼容的 Bean, 此時 Bean 的名稱作爲鍵值

使用 @Resource @Inject 自動裝配 Bean

Spring 還支持 @Resource @Inject 註解,這兩個註解和 @Autowired 註解的功用類似
@Resource 註解要求提供一個 Bean 名稱的屬性,若該屬性爲空,則自動採用標註處的變量或方法名作爲 Bean 的名稱
@Inject @Autowired 註解一樣也是按類型匹配注入的 Bean, 但沒有 reqired 屬性

        建議使用 @Autowired 註解,@Inject註解不建議使用

泛型依賴注入這個內容比較晦澀,我也不寫了。。。

整合多個配置文件 

Spring 允許通過 <import> 將多個配置文件引入到一個文件中,進行配置文件的集成。這樣在啓動 Spring 容器時,僅需要指定這個合併好的配置文件就可以。 

import 元素的 resource 屬性支持 Spring 的標準的路徑資源 

 

 

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