spring ioc原理詳解
ioc的理解
傳統方法:在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類耦合起來
ioc的思想
所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。
DI(依賴注入)
在系統執行中,動態的向某個物件提供它所需要的其他物件
如何注入
通過反射機制實現,在例項化一個類時,它通過反射呼叫類中set方法將事先儲存在HashMap中的類屬性注入到類中,最後它將這個類的例項返回給我們,我們就可以用了
aop
將分散在各個業務邏輯中的相同程式碼,通過橫向切割的方式抽取到一個獨立的模組中,還業務邏輯類一個清新的世界。
aop是基於動態代理實現的
代理
代理的目的:在不修改目標(被代理)物件的前提下,對目標物件功能進行擴充套件
靜態代理
靜態代理只能代理一個具體的類,如果要代理一個介面的多個實現的話需要定義不同的代理類。所以需要動態代理
靜態代理要求代理物件和被代理物件要實現同一個介面
動態代理
代理類繼承了 Proxy
類,並實現了 ISubject
介面,由此也可以看到 JDK 動態代理為什麼需要實現介面,已經繼承了 Proxy
是不能再繼承其餘類了。
其中實現了 ISubject
的 execute()
方法,並通過 InvocationHandler
中的 invoke()
方法來進行呼叫的。
動態代理中,代理物件不需要實現介面,被代理物件要實現介面
cglib動態代理(也叫子類代理)
JDK的動態代理有一個限制,就是使用動態代理的物件必須要實現一個或多個介面,有時候被代理沒有實現介面,那就需要Cglib代理。
cglib代理:也叫做子類代理,他是在記憶體中構建一個子類物件,從而實現對目標物件功能的擴充套件。cglib代理是對ASM框架的封裝,特點是繼承於被代理類,這就要求被代理類不能被 final
修飾。
spring AOP中的攔截器(interceptertion)用的就是cglib代理
spring AOP中的代理
- 如果加入容器的目標物件實現了介面,用JDK動態代理
- 如果目標物件沒實現介面,用cglib代理