aop

1.什么是AOP
面向切面編程,它是一種編程思想。Aop采取橫向抽取機(jī)制,取代了傳統(tǒng)
縱向繼承體系重復(fù)性代碼的編寫方式(例如,性能監(jiān)視、安全檢查、日志記錄等)
AOP是OOP的思想延續(xù)

傳統(tǒng)縱向代碼復(fù)用
需求:執(zhí)行save方法時(shí),先向日志表中插入數(shù)據(jù)
class UserDao{
public void save(){
//新增插入日志的方法
//執(zhí)行保存操作
}
}

解決方式1:
直接在save方法的執(zhí)行保存操作前,出入向日志中插入數(shù)據(jù)的代碼;
但若多個(gè)方法都需要新增插入日志的操作,則非常麻煩

解決方式2:
將通用的功能(插入日志)寫在抽象基類中,然后讓需要增加通用功能的組件
UserDao繼承,使用時(shí),調(diào)入
class abstract BaseDao{
//插入日志
public void writerLog(){
//向日志中插入數(shù)據(jù)
}
}
class UserDao extends BaseDao{
public void save(){
//新增插入日志的方法
super.writerLog();
//執(zhí)行保存操作
}
}

方式2 java不推薦使用繼承的方式進(jìn)行代碼的復(fù)用
缺點(diǎn):代碼植入,有侵入性

AOP 原理
Spring AOP主要是基于動(dòng)態(tài)代理技術(shù),當(dāng)spring采用aop配置后,
spring容器返回的目標(biāo)對(duì)象(需要增加代碼的類的實(shí)例),實(shí)質(zhì)上是spring
利用動(dòng)態(tài)代理技術(shù)生成的一個(gè)代理類型,代理類型重寫原目標(biāo)對(duì)象方法的功能
在代理類中調(diào)用切面(需要代理的一些方法和增強(qiáng)代碼)和目標(biāo)對(duì)象功能
通俗的說:基于代理思想,對(duì)原來目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象,在不修改原對(duì)象代碼
的情況下,通過代理對(duì)象,調(diào)用增強(qiáng)功能的代碼,從而對(duì)原有業(yè)務(wù)方法進(jìn)行
增強(qiáng)

AOP本質(zhì):將共通處理邏輯和原有傳統(tǒng)業(yè)務(wù)處理邏輯剝離,剝離后獨(dú)立封裝成組件
,之后通過配置低耦合形式切入到傳統(tǒng)業(yè)務(wù)組件中。這樣做的好處,便于日后
修改這些共通的業(yè)務(wù)邏輯時(shí),不會(huì)影響傳統(tǒng)的業(yè)務(wù)邏輯(將共通邏輯和傳統(tǒng)邏輯
進(jìn)行解耦)

AOP相關(guān)概念
Aspect(切面) :是通知和切入點(diǎn)的結(jié)合,通知和切入共同定義了關(guān)于切面的
全部?jī)?nèi)容--它的功能、在何時(shí)和何地完成其功能

jionPoint(連接點(diǎn)):所謂連接點(diǎn)指的是那些被攔截到的點(diǎn)。
在spring中,這些點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn)
pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對(duì)那些joinpoint進(jìn)行攔截的定義
通知定義了切面的“什么”和“何時(shí)”,切入點(diǎn)就定義了"何地"
advice(通知):所謂通知是指攔截到j(luò)oinpoint之后要做的事情(增強(qiáng)的代碼,即
共通組件及作用在目標(biāo)組件的時(shí)機(jī)(前置,后置...)
通知分為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知
target(目標(biāo)對(duì)象) :代理的目標(biāo)對(duì)象

weaving(織入):是指把切面應(yīng)用到目標(biāo)對(duì)象來創(chuàng)建新的代理對(duì)象的過程:切面
在指定的連接點(diǎn)織入的目標(biāo)對(duì)象

切入點(diǎn)的表達(dá)方式
切入點(diǎn):通俗的說就是往哪些組件切入
用于指定目標(biāo)組件及其方法,在spring中使用表達(dá)式表示
三種
===方法限定表達(dá)式===
execution(修飾符? 返回類型 方法名(參數(shù)列表) throws 異常?)
//匹配UserServiceImpl的registUser方法
execution(* org.ks.cost.service.UserServiceImpl.resistUser(..))
//匹配所有l(wèi)oad開始的方法
execution(* load(..))
//匹配所有service包下所有類的所有方法
execution(
org.ks.cost.service..(..))
//匹配所有service包及其子包所有類的所有方法
execution(* org.ks.cost.service...(..))

==類型限定表達(dá)式===
within(類型)
//匹配UserServiceImpl類型的所有的方法
within(org.ks.cost.service.UserServiceImpl)
//匹配service包下所有類的所有的方法
within(org.ks.cost.service.)
//匹配所有service包及其子包所有類的所有方法
within(org.ks.cost.service..
)

==Bean名稱限定表達(dá)式===
bean(id名)
//匹配id=userServiceImpl組件對(duì)象的所有方法
bean("userServiceImpl")
//匹配所有id名以service結(jié)尾的組件對(duì)象的所有的方法
bean("*service")

spring aop編程的兩種方式
方式一:spring 1.2開始支持aop編程(傳統(tǒng)springaop編程)
編程非常復(fù)雜,spring框架采用了兩種動(dòng)態(tài)代理實(shí)現(xiàn)
a\利用cglib工具包
b\利用jdkProxy api
方式二:spring2.0之后支持第三方aop框架(aspectJ)實(shí)現(xiàn)另一種aop編程---推薦

步驟:
1、XML
step1、確定不表對(duì)象,確定bean對(duì)象
step2、advice(通知)的編寫
step3、配置切面(通知,切入點(diǎn),即通知和切入點(diǎn)的關(guān)聯(lián))

五種通知小結(jié)
1.只要掌握Around通知類型,就可以實(shí)現(xiàn)其他四種通知效果
2.可以在環(huán)繞通知的方法中按如下格式編寫代碼:
try{
//前置通知的代碼
Object reuslt=proceedingJoinPoint.proceed();
//后置通知的代碼
}catch(Exception e){
//拋出通知
}finally{
//最終通知
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,202評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,297評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,688評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,875評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,438評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,183評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,384評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,612評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評(píng)論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,093評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,330評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容