IoC(Inversion of Control)就是由容器控制程序之間的關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關系由容器在運行期決定,形象地說,即由容器動態地將某種依賴關系注入到組件之中。
IoC是近年來興起的一種思想,不僅僅是編程思想。主要是協調各組件間相互的依賴關系,同時大大提高了組件的可移植性,組件的重用機會也變得更多。在傳統的實現中,由程序內部代碼來控制程序之間的關系。我們經常使用new關鍵字來實現兩組鍵間關系的組合,這種實現的方式會造成組件之間耦合(一個好的設計,不但要實現代碼重用,還要將組件間關系解耦)。IoC很好的解決了該問題,它將實現組件間關系從程序內部提到外部容器來管理。也就是說由容器在運行期將組件間的某種依賴關系動態的注入組件中。控制程序間關系的實現交給了外部的容器來完成。
IoC的實現形式有兩種:
依賴查找:容器提供回調接口和上下文環境給組件。EJB和Apache Avalon都是使用這種方式。
依賴注入:組件不做定位查詢,只是提供普通的Java方法讓容器去決定依賴關系。容器全權負責組件的裝配,它會把符合依賴關系的對象通過JavaBean屬性或者構造子傳遞給需要的對象。
通過JavaBean屬性注射依賴關系的做法稱為設值方法注入(Setter Injection);
將依賴關系作為構造子參數傳入的做法稱為構造子注入(Constructor Injection)。
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等。