IOC,AOP的實現原理是什麼?物物互聯夢動者2020-06-01 23:14:00

IOC:

java程式中的每個業務邏輯至少需要兩個或以上的物件來協作完成,通常,在使用其他的合作物件時,均要使用像new object() 這樣的語法來完成合作物件的申請工作。你會發現:物件間的耦合度高了。而IOC的思想是:Spring容器來實現這些相互依賴物件的建立、協調工作。物件只需要關心業務邏輯本身就可以了。從這方面來說,物件如何得到他的協作物件的責任被反轉了(IOC、DI)。

IOC是基於java的反射機制以及工廠模式實現的。具體可以看下這兩篇文章,https://www。cnblogs。com/Eason-S/p/5851078。html和http://blog。csdn。net/liushuijinger/article/details/35978965,寫的都很好

工場:各類都實現了某一介面,並提供一個工場類,根據傳入引數的不同來建立不同的物件

反射:可以根據類名獲取該類例項, Class。forName(ClassName)。newInstance()

在使用spring的時候會將每一個service定義為一個bean,這些bean的名字肯定是不同的,spring會維護一個xml檔案,檔案中各條記錄的id是bean的名字,value是對應的完整類名(包括路徑),在專案啟動時將該檔案中的id和value獲取,透過反射的方式將value即類名所對應的例項建立,然後將id即bean的名字與例項以類似鍵值對的方式儲存在spring容器中,當需要使用時直接利用getBean(String beanName)從容器中獲取對應的例項。

AOP主要是使用動態代理實現 https://www。cnblogs。com/lcngu/p/5339555。html,https://www。cnblogs。com/cenyu/p/6289209。html這個講代理的也挺好

AOP(面向切面程式設計)技術利用一種稱為“橫切”的技術,解剖封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,這樣就能減少系統的重複程式碼,降低模組間的耦合度,並有利於未來的可操作性和可維護性。AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。比如許可權認證、日誌、事務處理。

動態代理(被代理的類需要實現一個介面):中使用InvocationHandler介面和Proxy類來實現,在InvocationHandler中的invoke(Proxy proxy,Method method, object arg[])方法,中處理日誌,認證,事務等操作

步驟:(1)構造InvocationHandler處理器,定義invoke()方法(2)獲取Proxy代理類,並生成代理類物件,呼叫方法完成相關操作

Proxy。newProxyInstance()

public static Object newProxyInstance(ClassLoader loader,

Class<?>[] interfaces,

InvocationHandler h)

throws IllegalArgumentException

newProxyInstance,方法有三個引數:

loader: 用哪個類載入器去載入代理物件

interfaces:動態代理類需要實現的介面

h:動態代理方法在執行時,會呼叫h裡面的invoke方法去執行,invoke(Proxy proxy,Method method, object arg[])

靜態代理:實現了被代理類介面的類,其中儲存了一個被代理類的例項。在介面的實現方法中,呼叫被代理物件對應的方法,同時新增需要的其他操作。缺點:代理類和委託類都實現了同樣的介面,程式碼重複;當需要對對不同的委託類實現相同的處理時,需要定義多個代理類

無論是靜態代理還是動態代理都需要委託類實現介面,如果要對不實現介面的類進行代理,就需要使用cglib庫,使用Enhancer來建立代理類,使用MethodIntercepter介面,重寫intercept()方法,實現具體操作。