Spring基礎概念IOC、DI、Bean和AOP
一、前言
IOC、DI和AOP屬於Spring開發的核心思想,是學習Spring開發繞不開的基礎知識點,下面將會結合網上的眾家之言對它們進行一次總結。
二、IOC、DI、Bean和AOP的概念理解
2.1 IOC是什麼
IoC(Inversion of Control,控制反轉)並不是一種技術,只是一種思想,一個重要的面向物件的程式設計的法則—好萊塢法則:“別找我們,我們找你”,在實際程式設計中體現的便是,由IOC容器幫助物件找相應的依賴物件並注入,而不是由物件主動去找。這點可以用傳統的應用程式設計來進行比較。傳統的應用程式開發,都是在類的內部主動建立依賴物件,這樣就導致了類與類之間的高度耦合,不利於測試和功能的複用;採用IoC容器之後,就可以把建立和查詢依賴物件的控制權交給容器,由容器進行注入組合物件,這樣實現了物件之間的鬆散耦合,便於測試和複用,使得程式的整個體系結構變得非常靈活。
控制反轉和正轉
控制正轉:在傳統的應用程式中,物件主動控制去直接獲取依賴物件,就是正轉。
控制反轉:由容器來幫忙建立及注入依賴物件,就是反轉。
2.2 DI是什麼
DI(Dependency Injection依賴注入)直白的解釋便是將依賴注入到需要依賴的物件,注入操作是在執行過程中動態的向物件提供需要依賴的物件。可以以物件TestA訪問資料庫的操作為例,在此前的程式碼編寫過程中,需要我們在程式碼中自己編寫程式碼來獲得一個Connection物件。但是有了Spring的DI之後,我們只需要告訴Spring,TestA物件需要一個Connection物件,至於Connection物件構造的方法和時機,在TestA程式碼中並不需要為此負責。Spring會在適當的時候構造一個Connection物件,注入到TestA當中,解決了TestA對Connection的依賴關係。
DI(Dependency Injection依賴注入)實現的方式有四種,分別是:
- 使用屬性的setter方式注入(這是最常用的方式)。
- 使用構造器注入。
- 使用Field注入(用於註解方式)。
- 採用自動裝配。
以上四種實現方式可以參考部落格Spring中依賴注入的四種方式
2.3 Bean是什麼
Bean可以理解為裝配在一起的物件,也可以理解成Bean定義了一個元件,這個元件用於具體實現某個功能,而Bean提供了一個更為簡便的方法來呼叫元件實現你需要的功能。下面以Bean使用的範例來進行說明:
//定義一個Bean <bean id="userAction" class="com.neusoft.gmsbs.gms.user.action.UserAction" scope="prototype"> <property name="userBO" ref="userBO" /> </bean> // id:標識該bean的名稱,通過factory.getBean("id")來獲得例項 // Class:該bean的類路徑 // property:bean的屬性,上面的意思表示在userAction中需要實現userBO依賴功能,可以通過setter注入完成
Bean的其它屬性:
Singleton:預設為true,即單例模式,每次getBean("id")時獲取的都是同一個例項,如果設定為false,則為原型模式,每次獲取的都是新建立的例項。
Init-method:在bean例項化後要呼叫的方法(bean裡定義好的方法)。
Destroy-method:bean從容器裡刪除之前要呼叫的方法。
Autowrite:其屬性要通過何種方法進行屬性的自動裝配。
Bean的使用範例一:
ApplicationContext factory = new ClassPathXmlApplicationContext("beans.xml");
UserAction action= (UserAction)factory.getBean("userAction"); // 該操作等同於UserAction action = new UserAction()
Bean的使用範例二:
<bean id="m1" class="com.yang.myshow">
<property name="p" ref="userAction"></property> //在其它Bean中關聯bean userAction
</bean>
</beans>,不可避免的
2.4 AOP的概念理解
AOP(Aspect Oriented Programming面向切面程式設計)是OOP的延續和補充,被廣泛用於處理一些具體橫切性質的系統級服務,比如事務管理、安全檢查、快取、物件池管理等。下面以系統事務管理中系統操作資料庫為例來對AOP進行說明。
在系統操作資料庫的過程中,不可以避免的需要考慮到事務相關的內容。如果在每個方法中都新建一
個事務管理器,這將會給程式碼帶來嚴重的耦合性。為了簡化開發過程,可以將事務相關的程式碼抽取出
來做為一個獨立的模組。通過AOP,每一個操作資料庫的方法為一個連結點,這些連線點組成一個切
面。當程式執行到其中某個切點時,將事務管理模組順勢織入到物件中,通過通知功能,完成整個事
務管控的實現。這樣一來,所有的資料庫操作方法中不需要在單獨關心事務管理的內容,只需要關注
自身的業務程式碼的實現即可。所有的事務管控相關的內容都可通過AOP的方式進行了實現。簡化了代
碼的內容,將目標物件複雜的內容進行解耦,分離業務邏輯與橫切關注點。
AOP的相關概念如下:
- 通知:定義切面是什麼,以及何時使用的概念。Spring中可以應用的5種類型通知如下:
- 前置通知(Before):在目標方法被呼叫之前呼叫通知功能。
- 後置通知(After):在目標方法完成之後呼叫通知,此時不會關心方法的輸出是什麼。
- 返回通知(After-returning):在目標方法成功執行之後呼叫通知。
- 異常通知(After-throwing):在目標方法丟擲異常後呼叫通知。
- 環繞通知(Around):通知包裹了被通知的方法,在通知的方法呼叫之前和呼叫之後執行自定義的行為。
- 連結點:是在應用執行過程中能夠插入切面的一個點。
- 切點:切點定義了切面在何處要織入的一個或者多個連線點。
- 切面:是通知和切點的結合。通知和切點共同定義了切面的全部內容。
- 引入:引入允許我們向現有類新增新方法或屬性。
- 織入:是把切面應用到目標物件,並建立新的代理的過程。切面在指定的連線點被織入到目標物件中。在目標物件的生命週期中有多個點可以進行織入。
織入的生命期:- 編譯期:在目標類編譯時,切面被織入,這種方式需要特殊的編譯器。
- 類載入期:切面在目標載入到JVM時被織入,這種方式需要特殊的類載入器(class loader),這種類載入器可以在目標類被引入應用前增強該目標類的位元組碼。
- 執行期:切面在應用執行到某個時刻時被織入。一般情況下,在織入切面時,AOP容器會為目標物件動態地建立一個代理物件。SPringAOP就是以這種方式織入切面的。
三、總結
本部落格主要作為Spring Cloud初學者對Spring的基礎概念進行了整理和理解,並不一定的深刻,希望正在閱讀的你有幫助。
參考
1.深入理解Spring的兩大特徵(IOC和AOP)
2.Spring依賴注入的四種方式(重點是註解方式)
3.初識Spring的DI及其基本用法
4.Spring IOC 和 DI原理 (面試必備)
5.spring的DI
6.Spring中Bean及@Bean的理解
7.12.Spring Bean是什麼
8.spring裡面的bean到底是什麼鬼