Spring的IOC和AOP

Spring的簡單理解


Spring技術可以說是java企業開發裏最重要的技術,不過真的理解Spring的作用和意義還真是一件麻煩的事情。


Spring
最根本的使命:簡化Java開發。
爲了降低Java開發的複雜性,Spring採取以下4種關鍵策略:

1.      基於POJO的輕量級和最小侵入性編程

2.      通過依賴注入和麪向接口實現鬆耦合

3.      基於切面和慣例進行聲明式編程

4.      通過切面和模版減少樣板示代碼

Spring的優點

  • 輕量級:相較於EJB容器,Spring採用的IoC容器非常的輕量級,基礎版本的Spring框架大約只有2MB。Spring可以讓開發者們僅僅使用POJO(Plain Old Java Object,相對於EJB)就能夠開發出企業級的應用。這樣做的好處是,你不需要使用臃腫龐大的 EJB容器(應用服務器),你只需要輕量的servlet容器(如Tomcat)。尤其在一些開發當中,很稀缺內存和CPU資源時,採用Spring比EJB無論是開發還是部署應用都更節約資源。
  • 控制反轉(IOC):Spring使用控制反轉技術實現了鬆耦合。依賴被注入到對象,而不是創建或尋找依賴對象。
  • 面向切面編程(AOP): Spring支持面向切面編程,同時把應用的業務邏輯與系統的服務分離開來。
  • MVC框架:Spring MVC是一個非常好的MVC框架,可以替換其他web框架諸如Struts。
  • 集成性:Spring非常容易和其他的流行框架一起集成開發,這些框架包括:ORM框架,logging框架,JEE, Quartz,以及Struts等表現層框架。
  • 事務管理:Spring強大的事務管理功能,能夠處理本地事務(一個數據庫)或是全局事務(多個數據,採用JTA)。
  • 模塊分離:Spring框架是由模塊構成的。雖然已經有太多的包和類了,但它們都按照模塊分好類了,你只需要考慮你會用到的模塊,而不用理其他的模塊。
  • 異常處理:由於Java的JDBC,Hibernate等API中有很多方法拋出的是checked exception,而很多開發者並不能很好的處理異常。Spring提供了統一的API將這些checked exception的異常轉換成Spring的unchecked exception。
  • 單元測試:Spring寫出來的代碼非常容易做單元測試,可以採用依賴注射(Dependency Injection)將測試的數據注射到程序中。

Spring的IOC


IOC技術第一個解釋叫做控制反轉(IOC),它還有個解釋就是依賴注入(DI),這兩個名字很難從字面理解,但是當你理解它的原理後就會發現它們的描述是何等準確。IOC技術的本質就是構建對象的技術換句話說就是將一個類實例化成對象的技術。

耦合具有兩面性。一方面,緊密耦合的代碼難以測試,難以複用,難以理解,並且表現出“打地鼠”式的bug特性(修復一個bug,導致出現一個新的或者甚至更多的bug)。另一方面,一定程度的耦合又是必須的,完全沒有耦合的代碼什麼也做不了。爲了完成有實際意義的工作,不同的類必須以適當的方式進行交互。總而言之,耦合是必須的,但應當小心謹慎的管理它。通過控制反轉或者依賴注入,對象的依賴關係將由負責協調系統中各個對象的第三方組件在創建對象時設定。對象無需自行創建或管理它們的依賴關係,依賴關係將被自動注入到需要它們的對象中去。

我們通過實際生活中的一個例子來解釋一下IOC:

例如我們有個roo對象作用是完成打獵的操作,那麼打獵這個對象內部包含兩個輔助對象:人和槍,只有人和槍賦予了打獵這個對象,那麼打獵對象才能完成打獵的操作,但是構建一個人和槍的對象並不是看起來那麼簡單,這裏以槍爲例,要創造一把槍我們需要金屬,需要機牀,需要子彈,而機牀和子彈又是兩個新對象,這些對象一個個相互嵌套相互關聯,大夥試想下如果我們在java代碼裏構建一個槍的對象那是何其的複雜,假如我們要構造的不是簡單的槍對象而是更加複雜的航空母艦,那麼構造這個對象的成本之高是讓人難以想象的,怎麼來消除這種對象相互嵌套相互依賴的關係了?

Spring提供了一種方式,這種方式就是Spring提供一個容器,我們在xml文件裏定義各個對象的依賴關係,由容器完成對象的構建,當我們Java代碼裏需要使用某個實例的時候就可以從容器裏獲取,那麼對象的構建操作就被Spring容器接管,所以它被稱爲控制反轉。

控制反轉的意思就是本來屬於java程序裏構建對象的功能交由容器接管,依賴注入就是當程序要使用某個對象時候,容器會把它注入到程序裏。在Java開發裏我們想使用某個類提供的功能,有兩種方式:一種就是構造一個新的類,新的類繼承該類,另一種方式則是將某個類定義在新類裏,那麼兩個類之間就建立一種關聯關係,Spring的IOC容器就是實現了這種關聯關係。

通過上面這段內容,相信大家應該會對IOC有個比較清晰的瞭解了。關於Spring中IOC部分是如何實現以及使用,就不進行討論了,本文的目的也是能從整體上把握一下。但可以稍微提一點,Spring的IOC功能其實就是依賴於Java的反射機制。直白點說,當你在xml文件中配置好了bean(bean需要提供全類名)之後,Spring通過自己的類對xml文件進行解析,然後利用反射機制將對象創建出來,然後放到自己的數據結構中,比如Map。然後鍵就是bean中的id屬性的值,值就是創建的對象。

Spring的AOP


在設計模式裏有一種代理模式,代理模式將繼承模式和關聯模式結合在一起使用,代理模式就是繼承模式和關聯模式的綜合體,不過這個綜合體的作用倒不是解決對象注入的問題,而是爲具體操作對象找到一個保姆或者是祕書,這就和小說裏的二號首長一樣,這個二號首長對外代表了具體的實例對象,實例對象的入口和出口都是通過這個二號首長,具體的實例對象是一號首長,一號首長是要幹大事的,所以一些事務性,重複性的工作例如泡茶,安排車子,這樣的工作是不用勞煩一號首長的大駕,而是二號首長幫忙解決的,這就是AOP的思想。AOP解決程序開發裏事務性,和核心業務無關的問題,但這些問題對於業務場景的實現是很有必要的,在實際開發裏AOP也是節省代碼的一種方式。

AOP將應用系統分爲兩部分,核心業務邏輯(Core business concerns)及橫向的通用邏輯,也就是所謂的方面Crosscutting enterprise concerns,例如,所有大中型應用都要涉及到的持久化管理(Persistent)、事務管理(Transaction Management)、安全管理(Security)、日誌管理(Logging)和調試管理(Debugging)等。

實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。

Spring的AOP代理對象的生成

Spring提供了兩種方式來生成代理對象: JDKProxy和Cglib,具體使用哪種方式生成由AopProxyFactory根據AdvisedSupport對象的配置來決定。默認的策略是如果目標類是接口,則使用JDK動態代理技術,否則使用Cglib來生成代理。


感謝原博客地址:http://tracylihui.github.io/2015/07/28/spring/Spring%E7%9A%84IOC%E5%92%8CAOP/#Spring的IOC



發佈了18 篇原創文章 · 獲贊 26 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章