摘要:注意前一節(jié)我們的代理是對(duì)對(duì)象進(jìn)行了代理,而的可以基于方法進(jìn)行代理,因?yàn)轭惖膶傩院头椒ǘ加邢鄳?yīng)的類來(lái)描述或者對(duì)應(yīng)屬性由的表示,方法由來(lái)表示這里說(shuō)幾個(gè)的接口或類切入點(diǎn)用來(lái)說(shuō)明是對(duì)哪些類的哪些方法進(jìn)行橫切就是被代理的對(duì)象的一個(gè)集合說(shuō)明對(duì)哪些類進(jìn)行
注意: 前一節(jié)我們的代理是對(duì)對(duì)象進(jìn)行了代理,而spring 的AOP 可以基于方法進(jìn)行代理,因?yàn)轭惖膶傩院头椒ǘ加邢鄳?yīng)的類來(lái)描述或者對(duì)應(yīng) 屬性由java的Field 表示,方法由Method 來(lái)表示
這里說(shuō)幾個(gè)spring AOP 的接口或類
1 切入點(diǎn)org.springframework.aop.Pointcut用來(lái)說(shuō)明是對(duì)哪些類的哪些方法進(jìn)行橫切,就是被代理的對(duì)象的一個(gè)集合
public interface Pointcut{ //說(shuō)明對(duì)哪些類進(jìn)行橫切 ClassFilter getClassFilter(); //用來(lái)說(shuō)明對(duì)哪些方法進(jìn)行橫切 MethodMatcher getMethodMatcher(); Pointcut TRUE = TruePointcut.INSTANCE; }2 連接點(diǎn)
org.springframework.aop.JoinPoint 當(dāng)程序運(yùn)行時(shí),對(duì)某一個(gè)具體的要被橫切的方法的描述,通過(guò)它可以獲取被橫切,也就是被代理的那個(gè)方法的運(yùn)行時(shí)的狀態(tài),例如,被代理的方法的參數(shù),所屬對(duì)象,所屬對(duì)象簽名,代理對(duì)象。
public interface JoinPoint { //... //獲取所屬對(duì)象 Object getTarget(); //獲取被代理的方法的參數(shù) Object[] getArgs(); //獲取連接點(diǎn)的簽名 Signature getSignature(); //描述位置,哪一行 SourceLocation getSourceLocation(); //... }3 通知
MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice, Advice是對(duì)
附加方法(被代理的方法前后需要執(zhí)行的)的描述
3.1
public interface MethodBeforeAdvice extends BeforeAdvice { void before(Method method, Object[] args, Object target) throws Throwable; }
方法說(shuō)明:before方法有三個(gè)參數(shù) 被增強(qiáng)的方法,參數(shù),被橫切的對(duì)象從理論上來(lái)說(shuō)在before的方法內(nèi)部可以執(zhí)行 method.invoke(target,args) 來(lái)執(zhí)行被增強(qiáng)的方法,但是我們一般不會(huì)這么做,我們會(huì)用這三個(gè)參數(shù)來(lái)動(dòng)態(tài)獲取一些信息,或其它功能,但不是去執(zhí)行被增強(qiáng)的方法,也就是說(shuō)BeforeAdvice沒(méi)有代理的職責(zé)。
接口說(shuō)明:BeforeAdvice繼承Advice,BeforeAdvice 和 Advice都是標(biāo)識(shí)接口 沒(méi)有方法,沒(méi)有屬性
參數(shù)說(shuō)明:method 具體的一個(gè)連接點(diǎn) args 連接點(diǎn)的參數(shù) target 連接點(diǎn)所屬的對(duì)象
3.2
public interface AfterReturningAdvice extends AfterAdvice { void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable; }
這里同樣沒(méi)有代理的職責(zé)
接口說(shuō)明:AfterAdvice繼承Advice,都是標(biāo)識(shí)接口 沒(méi)有方法,沒(méi)有屬性
參數(shù)說(shuō)明:returnValue被代理的方法的返回值的描述 method 具體的一個(gè)連接點(diǎn) args 連接點(diǎn)的參數(shù) target 連接點(diǎn)所屬的對(duì)象
3.3
public interface ThrowsAdvice extends AfterAdvice { }
public void afterThrowing(Exception ex)
public void afterThrowing(RemoteException)
public void afterThrowing(Method method, Object[] args, Object target, Exception ex)
public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)
說(shuō)明:ThrowsAdvice沒(méi)有方法,沒(méi)有屬性,但是實(shí)現(xiàn)這個(gè)接口的類必須有 afterThrowing 方法
4 攔截器MethodInterceptor方法攔截器, 繼承了Interceptor接口,Interceptor接口又繼承了Advice接口,Interceptor和Advice都是標(biāo)識(shí)接口沒(méi)有屬性和方法
public interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws Throwable; }
這里的invoke方法有代理的責(zé)任,也就是說(shuō)在invoke方法內(nèi)部會(huì)調(diào)用代理的那個(gè)方法,也就是去執(zhí)行連接點(diǎn)
MethodInvocation繼承了Invocation接口,Invocation接口繼承了Joinpoint接口,注意這里是Joinpoint,是java語(yǔ)言的java.lang.reflect.AccessibleObject.Pointcut而Joinpoint接口內(nèi)部有 Object proceed() throws Throwable這樣一個(gè)方法,調(diào)用這個(gè)方法會(huì)執(zhí)行JoinPoint描述的那個(gè)被代理的方法。
Advisor是Pointcut和Advice的配置器,將 某個(gè)具體的 Advice 注入到 Pointcut所指定的位置
public interface Advisor { Advice getAdvice(); boolean isPerInstance(); } public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable { private Pointcut pointcut = Pointcut.TRUE; //... public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut; setAdvice(advice); } //... } public abstract class AbstractGenericPointcutAdvisor extends AbstractPointcutAdvisor { private Advice advice; /** * Specify the advice that this advisor should apply. */ public void setAdvice(Advice advice) { this.advice = advice; } @Override public Advice getAdvice() { return this.advice; } }
從上面我們可以看到DefaultPointcutAdvisor需要持有一個(gè)Advice的對(duì)象一個(gè)Pointcut的對(duì)象我們?cè)谑褂玫臅r(shí)候只需要為它提供這兩個(gè)對(duì)象他就會(huì)去自己進(jìn)行配置
6 代理工廠ProxyFactoryBean, 創(chuàng)建代理對(duì)指定的某個(gè)類的對(duì)象進(jìn)行代理,或者對(duì)符合規(guī)則的一堆類進(jìn)行代理使用時(shí)只需進(jìn)行配置。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65153.html
摘要:是什么是面向切面編程的簡(jiǎn)稱。負(fù)責(zé)實(shí)施切面,它將切面所定義的橫切邏輯織入到切面所指定的連接點(diǎn)鐘。靜態(tài)正則表達(dá)式匹配切面是正則表達(dá)式方法匹配的切面實(shí)現(xiàn)類。流程切面的流程切面由和實(shí)現(xiàn)。 aop是什么 aop是面向切面編程(aspect oriented programing)的簡(jiǎn)稱。aop的出現(xiàn)并不是要完全替代oop,僅是作為oop的有益補(bǔ)充。aop的應(yīng)用場(chǎng)合是有限的,一般只適合于那些具有橫...
摘要:了解的相關(guān)術(shù)語(yǔ)通知通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。就是用來(lái)配置切面設(shè)置代理模式。 了解AOP的相關(guān)術(shù)語(yǔ) 1.通知(Advice): 通知定義了切面是什么,以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。 2.連接點(diǎn)(Joinpoint): 程序能夠應(yīng)用通知的一個(gè)時(shí)機(jī),這些時(shí)機(jī)就是連接點(diǎn),例如方法被調(diào)用時(shí)、異常被拋出時(shí)等等。 ...
摘要:表示少女與緊耦合在它的構(gòu)造函數(shù)中自行創(chuàng)建了。面向切面編程往往被定義為促使軟件系統(tǒng)實(shí)現(xiàn)關(guān)注點(diǎn)的分離一項(xiàng)技術(shù)系統(tǒng)由許多不同的組件組成,每個(gè)組件各負(fù)責(zé)一特定的功能。我們可以把切面想象為覆蓋在很多組件之上的一個(gè)外殼。 第1章 Spring之旅 說(shuō)明 1、本文抄寫(xiě)了《Spring 實(shí)戰(zhàn)》重點(diǎn)內(nèi)容,參考了GitHub上的代碼 2、每個(gè)人的學(xué)習(xí)方式不一樣,但目的是一樣的,活學(xué)活用。最近一直在聽(tīng)《我...
摘要:自定義注解不生效原因解析及解決方法背景項(xiàng)目中,自己基于實(shí)現(xiàn)了一套緩存注解。但是最近出現(xiàn)一種情況緩存竟然沒(méi)有生效,大量請(qǐng)求被擊穿到層,導(dǎo)致壓力過(guò)大。至此,問(wèn)題得到解決。 自定義注解不生效原因解析及解決方法 背景: 項(xiàng)目中,自己基于spring AOP實(shí)現(xiàn)了一套java緩存注解。但是最近出現(xiàn)一種情況:緩存竟然沒(méi)有生效,大量請(qǐng)求被擊穿到db層,導(dǎo)致db壓力過(guò)大?,F(xiàn)在我們看一下具體代碼情形(代...
摘要:的面向的異常遵從通用的異常層次結(jié)構(gòu)。比如以前常用的框架,現(xiàn)在常用的框架包含許多項(xiàng)目,下面挑一些最常用的出來(lái)總結(jié)一下。狀態(tài)是流程中事件發(fā)生的地點(diǎn),在流程中通過(guò)轉(zhuǎn)移的方式從一個(gè)狀態(tài)到另一個(gè)狀態(tài),流程的當(dāng)前狀況稱為流程數(shù)據(jù)。 如今做Java尤其是web幾乎是避免不了和Spring打交道了,但是Spring是這樣的大而全,新鮮名詞不斷產(chǎn)生,學(xué)起來(lái)給人一種凌亂的感覺(jué),我就在這里總結(jié)一下,理順頭緒...
閱讀 3119·2021-10-12 10:12
閱讀 5620·2021-09-26 10:20
閱讀 1579·2021-07-26 23:38
閱讀 2869·2019-08-30 15:54
閱讀 1706·2019-08-30 13:45
閱讀 2013·2019-08-30 11:23
閱讀 3164·2019-08-29 13:49
閱讀 932·2019-08-26 18:23