javascript
Spring AOP功能和目标
1.AOP的作用
在OOP中,正是這種分散在各處且與對象核心功能無關(guān)的代碼(橫切代碼)的存在,使得模塊復(fù)用難度增加。AOP則將封裝好的對象剖開,找出其中對多個對象產(chǎn)生影響的公共行為,并將其封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),切面將那些與業(yè)務(wù)無關(guān),卻被業(yè)務(wù)模塊共同調(diào)用的邏輯提取并封裝起來,減少了系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時提高了系統(tǒng)的可維護性。
2.DI 和 IOC 概念
依賴注入或控制反轉(zhuǎn)的定義中,調(diào)用者不負(fù)責(zé)被調(diào)用者的實例創(chuàng)建工作,該工作由Spring框架中的容器來負(fù)責(zé),它通過開發(fā)者的配置來判斷實例類型,創(chuàng)建后再注入調(diào)用者。由于Spring容器負(fù)責(zé)被調(diào)用者實例,實例創(chuàng)建后又負(fù)責(zé)將該實例注入調(diào)用者,因此稱為依賴注入。而被調(diào)用者的實例創(chuàng)建工作不再由調(diào)用者來創(chuàng)建而是由Spring來創(chuàng)建,控制權(quán)由應(yīng)用代碼轉(zhuǎn)移到了外部容器,控制權(quán)發(fā)生了反轉(zhuǎn),因此稱為控制反轉(zhuǎn)。
3.BeanFactory與ApplicationContext
ApplicationContext是BeanFactory的子接口,也被稱為應(yīng)用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext則添加了更多企業(yè)級功能(如國際化的支持),他另一重要優(yōu)勢在于當(dāng)ApplicationContext容器初始化完成后,容器中所有的 singleton Bean 也都被實例化了,也就是說當(dāng)你需要使用singleton Bean 是,在應(yīng)用中無需等待就可以用,而其他BeanFactory接口的實現(xiàn)類,則會延遲到調(diào)用 getBean()方法時構(gòu)造,ApplicationContext的初始化時間會稍長些,調(diào)用getBean()是由于Bean已經(jīng)構(gòu)造完畢,速度會更快。因此大部分系統(tǒng)都使用ApplicationContext,而只在資源較少的情況下,才考慮使用BeanFactory。
4.AOP的實現(xiàn)策略
(1)Java SE動態(tài)代理:
使用動態(tài)代理可以為一個或多個接口在運行期動態(tài)生成實現(xiàn)對象,生成的對象中實現(xiàn)接口的方法時可以添加增強代碼,從而實現(xiàn)AOP。缺點是只能針對接口進(jìn)行代理,另外由于動態(tài)代理是通過反射實現(xiàn)的,有時可能要考慮反射調(diào)用的開銷。
(2)字節(jié)碼生成(CGLib 動態(tài)代理)
動態(tài)字節(jié)碼生成技術(shù)是指在運行時動態(tài)生成指定類的一個子類對象,并覆蓋其中特定方法,覆蓋方法時可以添加增強代碼,從而實現(xiàn)AOP。其常用工具是cglib。
(3)定制的類加載器
當(dāng)需要對類的所有對象都添加增強,動態(tài)代理和字節(jié)碼生成本質(zhì)上都需要動態(tài)構(gòu)造代理對象,即最終被增強的對象是由AOP框架生成,不是開發(fā)者new出來的。解決的辦法就是實現(xiàn)自定義的類加載器,在一個類被加載時對其進(jìn)行增強。JBoss就是采用這種方式實現(xiàn)AOP功能。
(4)代碼生成
利用工具在已有代碼基礎(chǔ)上生成新的代碼,其中可以添加任何橫切代碼來實現(xiàn)AOP。
(5)語言擴展
可以對構(gòu)造方法和屬性的賦值操作進(jìn)行增強,AspectJ是采用這種方式實現(xiàn)AOP的一個常見Java語言擴展。
核心概念
1、橫切關(guān)注點
對哪些方法進(jìn)行攔截,攔截后怎么處理,這些關(guān)注點稱之為橫切關(guān)注點
2、切面(aspect)
類是對物體特征的抽象,切面就是對橫切關(guān)注點的抽象
3、連接點(joinpoint)
被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構(gòu)造器
4、切入點(pointcut)
對連接點進(jìn)行攔截的定義
5、通知(advice)
所謂通知指的就是指攔截到連接點之后要執(zhí)行的代碼,通知分為前置、后置、異常、最終、環(huán)繞通知五類
6、目標(biāo)對象
代理的目標(biāo)對象
7、織入(weave)
將切面應(yīng)用到目標(biāo)對象并導(dǎo)致代理對象創(chuàng)建的過程
8、引入(introduction)
在不修改代碼的前提下,引入可以在運行期為類動態(tài)地添加一些方法或字段
Spring對AOP的支持
Spring中AOP代理由Spring的IOC容器負(fù)責(zé)生成、管理,其依賴關(guān)系也由IOC容器負(fù)責(zé)管理。因此,AOP代理可以直接使用容器中的其它bean實例作為目標(biāo),這種關(guān)系可由IOC容器的依賴注入提供。Spring創(chuàng)建代理的規(guī)則為:
1、默認(rèn)使用Java動態(tài)代理來創(chuàng)建AOP代理,這樣就可以為任何接口實例創(chuàng)建代理了
2、當(dāng)需要代理的類不是代理接口的時候,Spring會切換為使用CGLIB代理,也可強制使用CGLIB
AOP編程其實是很簡單的事情,縱觀AOP編程,程序員只需要參與三個部分:
1、定義普通業(yè)務(wù)組件
2、定義切入點,一個切入點可能橫切多個業(yè)務(wù)組件
3、定義增強處理,增強處理就是在AOP框架為普通業(yè)務(wù)組件織入的處理動作
所以進(jìn)行AOP編程的關(guān)鍵就是定義切入點和定義增強處理,一旦定義了合適的切入點和增強處理,AOP框架將自動生成AOP代理,即:代理對象的方法=增強處理+被代理對象的方法。
轉(zhuǎn)載于:https://www.cnblogs.com/hkhk/p/10708260.html
總結(jié)
以上是生活随笔為你收集整理的Spring AOP功能和目标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之PIL库的运用、GIF处理
- 下一篇: JavaScript实现10大算法可视化