spring ioc和aop

zhusir發表於2018-08-22

spring ioc原理詳解

ioc的理解

    傳統方法:在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類耦合起來

ioc的思想

    所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。

DI(依賴注入)

    在系統執行中,動態的向某個物件提供它所需要的其他物件

如何注入

    通過反射機制實現,在例項化一個類時,它通過反射呼叫類中set方法將事先儲存在HashMap中的類屬性注入到類中,最後它將這個類的例項返回給我們,我們就可以用了

aop

    將分散在各個業務邏輯中的相同程式碼,通過橫向切割的方式抽取到一個獨立的模組中,還業務邏輯類一個清新的世界。

    aop是基於動態代理實現的  

詳看  spring AOP的實現原理

代理

    代理的目的:在不修改目標(被代理)物件的前提下,對目標物件功能進行擴充套件

靜態代理

    靜態代理只能代理一個具體的類,如果要代理一個介面的多個實現的話需要定義不同的代理類。所以需要動態代理

   靜態代理要求代理物件和被代理物件要實現同一個介面

動態代理

    代理類繼承了 Proxy 類,並實現了 ISubject 介面,由此也可以看到 JDK 動態代理為什麼需要實現介面,已經繼承了 Proxy是不能再繼承其餘類了。

其中實現了 ISubjectexecute() 方法,並通過 InvocationHandler 中的 invoke() 方法來進行呼叫的。

   動態代理中,代理物件不需要實現介面,被代理物件要實現介面

cglib動態代理(也叫子類代理)

    JDK的動態代理有一個限制,就是使用動態代理的物件必須要實現一個或多個介面,有時候被代理沒有實現介面,那就需要Cglib代理。

    cglib代理:也叫做子類代理,他是在記憶體中構建一個子類物件,從而實現對目標物件功能的擴充套件。cglib代理是對ASM框架的封裝,特點是繼承於被代理類,這就要求被代理類不能被 final 修飾。

    spring AOP中的攔截器(interceptertion)用的就是cglib代理

spring AOP中的代理

  1.     如果加入容器的目標物件實現了介面,用JDK動態代理
  2.     如果目標物件沒實現介面,用cglib代理






相關文章