老生常談IOC與AOP

IOC與AOP基本原理

IoC(Inversion of Control)就是由容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,形象地說,即由容器動態地將某種依賴關係注入到組件之中。

 

IoC是近年來興起的一種思想,不僅僅是編程思想。主要是協調各組件間相互的依賴關係,同時大大提高了組件的可移植性,組件的重用機會也變得更多。在傳統的實現中,由程序內部代碼來控制程序之間的關係。我們經常使用new關鍵字來實現兩組鍵間關係的組合,這種實現的方式會造成組件之間耦合(一個好的設計,不但要實現代碼重用,還要將組件間關係解耦)。IoC很好的解決了該問題,它將實現組件間關係從程序內部提到外部容器來管理。也就是說由容器在運行期將組件間的某種依賴關係動態的注入組件中。控制程序間關係的實現交給了外部的容器來完成。

 

IoC的實現形式有兩種:

     依賴查找:容器提供回調接口和上下文環境給組件。EJB和Apache Avalon都是使用這種方式。     

     依賴注入:組件不做定位查詢,只是提供普通的Java方法讓容器去決定依賴關係。容器全權負責組件的裝配,它會把符合依賴關係的對象通過JavaBean屬性或者構造子傳遞給需要的對象。

          通過JavaBean屬性注射依賴關係的做法稱爲設值方法注入(Setter Injection);

          將依賴關係作爲構造子參數傳入的做法稱爲構造子注入(Constructor Injection)。

 

Spring註解實現IOC

@Resource
@Resource有兩個常用屬性name、type,所以分4種情況

指定name和type:通過name找到唯一的bean,找不到拋出異常;如果type和字段類型不一致,也會拋出異常
指定name:通過name找到唯一的bean,找不到拋出異常
指定type:通過tpye找到唯一的bean,如果不唯一,則拋出異常:NoUniqueBeanDefinitionException
都不指定:通過字段名作爲key去查找,找到則賦值;找不到則再通過字段類型去查找,如果不唯一,則拋出異常:NoUniqueBeanDefinitionException
@Autowired
@Autowired只有一個屬性required,默認值爲true,爲true時,找不到就拋異常,爲false時,找不到就賦值爲null

@Autowired按類型查找,如果該類型的bean不唯一,則拋出異常;可通過組合註解解決@Autowired()@Qualifier("baseDao")

相同點
Spring都支持
都可以作用在字段和setter方法上
不同點
Resource是JDK提供的,而Autowired是Spring提供的
Resource不允許找不到bean的情況,而Autowired允許(@Autowired(required = false))
指定name的方式不一樣,@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao")
Resource默認通過name查找,而Autowired默認通過type查找
 

AOP爲Aspect Oriented Programming的縮寫,意爲:面向方面編程,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。

 

AOP主要應用於日誌記錄,性能統計,安全控制,事務處理等方面。

 

1、AOP相關概念:

      1)方面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的Advisor或攔截器實現。

      2)切入點(Pointcut):指定一個通知將被引發的一系列連接點的集合。

      3)連接點(Joinpoint):程序執行過程中明確的點,如方法的調用或特定的異常被拋出。

      4)通知(Advice):在特定的連接點,AOP框架執行的動作。

      5)目標對象(Target Object):包含連接點的對象,也被稱作被通知或被代理對象。

      6)AOP代理(AOP Proxy):AOP框架創建的對象,包含通知。在Spring中,AOP代理可以是JDK動態代理或CGLIB代理。

      7)引入(Introduction):添加方法或字段到被通知的類。Spring允許引入新的接口到任何被通知的對象。

      8)編織(Weaving):組裝方面來創建一個被通知對象。

 

2、Java領域的AOP實現有多種方案,主要包括:

      1)AspectJ (TM):創建於Xerox PARC. 有近十年曆史,技術成熟。但其過於複雜;破壞封裝;而且需要專門的Java編譯器,易用性較差。

      2)動態代理AOP:使用JDK提供的動態代理API或字節碼Bytecode處理技術來實現。基於動態代理API的具體項目有: JBoss 4.0 JBoss 4.0服務器。

      3)基於字節碼的AOP,例如:Aspectwerkz, CGlib, Spring等。

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