spring框架核心技術(shù)的兩大概念之AOP:
? ? AOP(Aspect Oriented Programming)是相對(duì)于傳統(tǒng)OOP來說的窖剑,在傳統(tǒng)OOP中浓领,代碼邏輯是自上而下的力图,經(jīng)常會(huì)出現(xiàn)一些橫切問題构韵,但是與業(yè)務(wù)關(guān)聯(lián)不大,導(dǎo)致代碼散落到代碼各處绰筛,難以維護(hù),而AOP則使得這些橫切代碼與業(yè)務(wù)代碼解耦描融。我們經(jīng)常應(yīng)用到的應(yīng)用場(chǎng)景包括但不限于日志記錄铝噩,權(quán)限驗(yàn)證,效率檢查窿克,事務(wù)管理骏庸。
? ? Spring中AOP主要有包括這些定義:?
????????aspect切面:是連接點(diǎn)毛甲、切面、代理的一個(gè)載體,
? ? ? ? pointcut切點(diǎn):表示的連接點(diǎn)的集合
????????Joinpoint連接點(diǎn): 表示程序代碼中的一個(gè)點(diǎn)具被,一般指方法
????????target 目標(biāo)對(duì)象:是原來的對(duì)象也就是被AOP代理增強(qiáng)的對(duì)象
????????Weaving 織入:目標(biāo)對(duì)的方法也就是連接點(diǎn)方法被增強(qiáng)的過程被稱為織入玻募。
????????advice通知:是增強(qiáng)方法在連接點(diǎn)的位置以及切點(diǎn)方法的邏輯實(shí)現(xiàn)。
JoinPoint是支持五種類型:
? ??Before:連接點(diǎn)執(zhí)行之前執(zhí)行
????After:連接點(diǎn)正常執(zhí)行之后執(zhí)行
????After throwing:連接點(diǎn)執(zhí)行拋出異常的時(shí)候
????After (finally):無論連接點(diǎn)是正常退出還是異常退出一姿,都會(huì)執(zhí)行
????Around advice: 環(huán)繞通知,圍繞連接點(diǎn)執(zhí)行七咧,例如方法調(diào)用。這是最有用的切面方式叮叹。around通知可以在方法調(diào)用之前和之后執(zhí)行自定義行為艾栋。它還負(fù)責(zé)選擇是繼續(xù)加入點(diǎn)還是通過返回自己的返回值或拋出異常來快速建議的方法執(zhí)行。
JoinPoint主要支持的切入點(diǎn)的標(biāo)識(shí)符如下:
? ??execution:用于匹配方法執(zhí)行連接點(diǎn)蛉顽,也是aop中最常用的方法蝗砾,因?yàn)榱6茸钚。芏ㄎ坏椒椒?jí)別
? ? within:粒度稍微粗點(diǎn)携冤,定位到包悼粮、接口、類級(jí)別
? ??args:與方法無關(guān)噪叙,匹配方法的入?yún)?/p>
? ??this:JDK代理時(shí),指向接口和jdk生成的代理類矮锈,而cglib代理時(shí),則指向接口以及子類
? ??target:用于匹配當(dāng)前目標(biāo)對(duì)象類型的執(zhí)行方法
JointPoint主要方法:
? ? getThis():返回代理對(duì)象
? ? getTarget():返回目標(biāo)對(duì)象
ProceedingPointCut:
? ? 繼承了JointPoint類睁蕾,能通過調(diào)用proceed調(diào)用連接點(diǎn)方法或通知苞笨,或者修改入?yún)?/p>
SpringAop與AspectJ的關(guān)系:springAop與aspectJ均為AOP思想的一種實(shí)現(xiàn),而springAOP中由于語(yǔ)法過于復(fù)雜而難以使用子眶,因此借助了aspectJ的語(yǔ)法來支持瀑凝,一般是通過注解@enableAspectJAutoProxy?或者xml aop:aspectj-autoProxy的定義的方式來開啟aspectJ語(yǔ)法的支持,springAop默認(rèn)使用JDK代理來實(shí)現(xiàn)AOP的代理臭杰,而JDK代理的實(shí)現(xiàn)方式為通過繼承Proxy類并實(shí)現(xiàn)接口來實(shí)現(xiàn)的,代碼為ProxyGenertor.generateProxyClass返回字節(jié)流粤咪,springAop還支持另外一種代理方式,可通過proxyTargetClass來開啟CGLIB的代理渴杆,cglib的實(shí)現(xiàn)是通過繼承目標(biāo)類實(shí)現(xiàn)的寥枝。
springAop中aspect默認(rèn)是單例的,可以通過perthis來處理部分代理對(duì)象為原型對(duì)象的情況,防止有共享對(duì)象在進(jìn)行aop處理的時(shí)候出現(xiàn)多線程的問題磁奖。