概念
AOP為Aspect Oriented Programming的縮寫牺蹄,意為:面向切面編程稠集,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
1库糠、橫切關(guān)注點(diǎn):對哪些方法進(jìn)行攔截伙狐,攔截后怎么處理涮毫,這些關(guān)注點(diǎn)稱之為橫切關(guān)注點(diǎn)。
2贷屎、切面(aspect):類是對物體特征的抽象罢防,切面就是對橫切關(guān)注點(diǎn)的抽象
3、連接點(diǎn)(joinpoint):被攔截到的點(diǎn)唉侄,因?yàn)镾pring只支持方法類型的連接點(diǎn)咒吐,所以在Spring中連接點(diǎn)指的就是被攔截到的方法.
4、切入點(diǎn)(pointcut):對連接點(diǎn)進(jìn)行攔截的定義
5属划、通知(advice):所謂通知指的就是指攔截到連接點(diǎn)之后要執(zhí)行的代碼恬叹,通知分為前置、后置同眯、異常绽昼、最終、環(huán)繞通知五類
6须蜗、目標(biāo)對象:代理的目標(biāo)對象
7硅确、織入(weave):將切面應(yīng)用到目標(biāo)對象并導(dǎo)致代理對象創(chuàng)建的過程
8、引入(introduction):在不修改代碼的前提下唠粥,引入可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或字段.
討論
1.什么是面向切面編程AOP疏魏?
這種在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類的指定方法晤愧、指定位置上的編程思想就是面向切面的編程大莫。
2.前文提到j(luò)dk代理和cglib代理兩種動(dòng)態(tài)代理,優(yōu)秀的spring框架把兩種方式在底層都集成了進(jìn)去,我們無需擔(dān)心自己去實(shí)現(xiàn)動(dòng)態(tài)生成代理官份。那么只厘,spring是如何生成代理對象的?
如果有接口,則使用Jdk代理,反之使用Cglib舅巷。spring AOP綜合兩種代理方式的使用前提有會(huì)如下結(jié)論:如果目標(biāo)類沒有實(shí)現(xiàn)接口羔味,且class為final修飾的,則不能進(jìn)行spring AOP編程钠右!
3.Spring AOP原理為什么用2種實(shí)現(xiàn)方式?JDKProxy和Cglib?
JDK動(dòng)態(tài)代理只能代理接口類赋元,所以很多人設(shè)計(jì)架構(gòu)的時(shí)候會(huì)使用
XxxService, XxxServiceImpl的形式設(shè)計(jì),一是讓接口和實(shí)現(xiàn)分離飒房,二是也有助于代理搁凸。
為什么不都使用Cgilb代理:
因?yàn)镴DK動(dòng)態(tài)代理不依賴其他包,Cglib需要導(dǎo)入ASM包狠毯,對于簡單的有接口的代理使用JDK動(dòng)態(tài)代理可以少導(dǎo)入一個(gè)包护糖。
AOP 代理
- spring 默認(rèn)使用 標(biāo)準(zhǔn) jdk 動(dòng)態(tài)代理,也可以使用 CGLIB 代理
spring aop 和 aspectj 的區(qū)別
其實(shí)對于AOP而言嚼松,AspectJ 也是一種非常優(yōu)秀的解決方案嫡良,AspectJ 會(huì)在編譯期對源碼進(jìn)行織入锰扶,從而達(dá)到方法增強(qiáng)的效果,不過要使用AspectJ 需要對字節(jié)碼有一定的了解寝受,而且還要學(xué)習(xí)AspectJ的語法坷牛,需要一定的學(xué)習(xí)成本。對于Spring 來說很澄,采用動(dòng)態(tài)織入的方法漓帅,在運(yùn)行期生成代理類,從而達(dá)到增強(qiáng)的效果痴怨。