面試記錄:IOC 與 AOP
什么是ioc,ioc 的好處?
ioc(Inverse of Control:控制反轉(zhuǎn)) ,一種設(shè)計思想, 將原本在程序中手動創(chuàng)建對象的控制權(quán),交由 spring 框架來管理。ioc 在不同的語言有不同的實現(xiàn)。
所謂控制反轉(zhuǎn),意為將在程序中創(chuàng)建對象的控制權(quán)轉(zhuǎn)移到 ioc 容器,調(diào)用者只需要在使用時從 ioc 容器中取出,如果一個工具對象的創(chuàng)建過程需要的依賴多,創(chuàng)建過程繁瑣,使用 ioc 提前配置好對象即可極大的簡化開發(fā),還能達(dá)到一個解耦合的效果。
在 spring 中,ioc 容器實際上是個 Map ,Map 中存放各種對象。早期的 spring 框架需要使用 xml 進(jìn)行對象的配置
AOP
aop(Aspect-Oriented Programming) 面向切面的編程,將與業(yè)務(wù)無關(guān),卻要跟業(yè)務(wù)方法共同調(diào)用的邏輯或責(zé)任(事物,日志),進(jìn)行封裝,用增強的形式添加到業(yè)務(wù)方法,我們不需要去變動業(yè)務(wù)方法本身就可以執(zhí)行這些邏輯。
在 spring 中使用 aop 可以用 Spring AOP 或 AspectJ。
AOP 術(shù)語
目標(biāo) Target:被通知的對象
代理 Porxy:向目標(biāo)對象通知后生成的代理對象
連接點 JoinPoint:目標(biāo)對象所屬的類中定義的方法
切入點 PointCut:被攔截/增強的連接點
通知 Advice:增強的邏輯/代碼
切面 ?Aspect:切入點和通知(已經(jīng)切入連接點的通知)
織入 ?Weaving:將通知應(yīng)用到目標(biāo)對象,進(jìn)而生成代理對象的過程動作
Spring AOP 和 AspectJ AOP
Spring AOP 是運行時增強, 于 JDK 動態(tài)代理(JDK Proxy),AspectJ 則是編譯時增強,是字節(jié)碼操作。
有大量 AOP 操作時,建議使用 AspectJ,性能要強一些。
AspectJ 的通知類型
Before 前置
After 后置
BeforeReturning 返回
AfterThrowing 異常
Around 環(huán)繞
可以使用 @Order 注解規(guī)定切面的執(zhí)行順序,參數(shù)越小有限度越高,繼承 Order 接口實現(xiàn) getOrder()方法也有同樣效果。實際上,@Order 的作用是定義Spring 容器中加載 Bean 的順序。