摘要:注意前一節我們的代理是對對象進行了代理,而的可以基于方法進行代理,因為類的屬性和方法都有相應的類來描述或者對應屬性由的表示,方法由來表示這里說幾個的接口或類切入點用來說明是對哪些類的哪些方法進行橫切就是被代理的對象的一個集合說明對哪些類進行
注意: 前一節我們的代理是對對象進行了代理,而spring 的AOP 可以基于方法進行代理,因為類的屬性和方法都有相應的類來描述或者對應 屬性由java的Field 表示,方法由Method 來表示
這里說幾個spring AOP 的接口或類
1 切入點org.springframework.aop.Pointcut用來說明是對哪些類的哪些方法進行橫切,就是被代理的對象的一個集合
public interface Pointcut{ //說明對哪些類進行橫切 ClassFilter getClassFilter(); //用來說明對哪些方法進行橫切 MethodMatcher getMethodMatcher(); Pointcut TRUE = TruePointcut.INSTANCE; }2 連接點
org.springframework.aop.JoinPoint 當程序運行時,對某一個具體的要被橫切的方法的描述,通過它可以獲取被橫切,也就是被代理的那個方法的運行時的狀態,例如,被代理的方法的參數,所屬對象,所屬對象簽名,代理對象。
public interface JoinPoint { //... //獲取所屬對象 Object getTarget(); //獲取被代理的方法的參數 Object[] getArgs(); //獲取連接點的簽名 Signature getSignature(); //描述位置,哪一行 SourceLocation getSourceLocation(); //... }3 通知
MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice, Advice是對
附加方法(被代理的方法前后需要執行的)的描述
3.1
public interface MethodBeforeAdvice extends BeforeAdvice { void before(Method method, Object[] args, Object target) throws Throwable; }
方法說明:before方法有三個參數 被增強的方法,參數,被橫切的對象從理論上來說在before的方法內部可以執行 method.invoke(target,args) 來執行被增強的方法,但是我們一般不會這么做,我們會用這三個參數來動態獲取一些信息,或其它功能,但不是去執行被增強的方法,也就是說BeforeAdvice沒有代理的職責。
接口說明:BeforeAdvice繼承Advice,BeforeAdvice 和 Advice都是標識接口 沒有方法,沒有屬性
參數說明:method 具體的一個連接點 args 連接點的參數 target 連接點所屬的對象
3.2
public interface AfterReturningAdvice extends AfterAdvice { void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable; }
這里同樣沒有代理的職責
接口說明:AfterAdvice繼承Advice,都是標識接口 沒有方法,沒有屬性
參數說明:returnValue被代理的方法的返回值的描述 method 具體的一個連接點 args 連接點的參數 target 連接點所屬的對象
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)
說明:ThrowsAdvice沒有方法,沒有屬性,但是實現這個接口的類必須有 afterThrowing 方法
4 攔截器MethodInterceptor方法攔截器, 繼承了Interceptor接口,Interceptor接口又繼承了Advice接口,Interceptor和Advice都是標識接口沒有屬性和方法
public interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws Throwable; }
這里的invoke方法有代理的責任,也就是說在invoke方法內部會調用代理的那個方法,也就是去執行連接點
MethodInvocation繼承了Invocation接口,Invocation接口繼承了Joinpoint接口,注意這里是Joinpoint,是java語言的java.lang.reflect.AccessibleObject.Pointcut而Joinpoint接口內部有 Object proceed() throws Throwable這樣一個方法,調用這個方法會執行JoinPoint描述的那個被代理的方法。
Advisor是Pointcut和Advice的配置器,將 某個具體的 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需要持有一個Advice的對象一個Pointcut的對象我們在使用的時候只需要為它提供這兩個對象他就會去自己進行配置
6 代理工廠ProxyFactoryBean, 創建代理對指定的某個類的對象進行代理,或者對符合規則的一堆類進行代理使用時只需進行配置。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65153.html
摘要:是什么是面向切面編程的簡稱。負責實施切面,它將切面所定義的橫切邏輯織入到切面所指定的連接點鐘。靜態正則表達式匹配切面是正則表達式方法匹配的切面實現類。流程切面的流程切面由和實現。 aop是什么 aop是面向切面編程(aspect oriented programing)的簡稱。aop的出現并不是要完全替代oop,僅是作為oop的有益補充。aop的應用場合是有限的,一般只適合于那些具有橫...
摘要:了解的相關術語通知通知定義了切面是什么,以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。就是用來配置切面設置代理模式。 了解AOP的相關術語 1.通知(Advice): 通知定義了切面是什么,以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。 2.連接點(Joinpoint): 程序能夠應用通知的一個時機,這些時機就是連接點,例如方法被調用時、異常被拋出時等等。 ...
摘要:表示少女與緊耦合在它的構造函數中自行創建了。面向切面編程往往被定義為促使軟件系統實現關注點的分離一項技術系統由許多不同的組件組成,每個組件各負責一特定的功能。我們可以把切面想象為覆蓋在很多組件之上的一個外殼。 第1章 Spring之旅 說明 1、本文抄寫了《Spring 實戰》重點內容,參考了GitHub上的代碼 2、每個人的學習方式不一樣,但目的是一樣的,活學活用。最近一直在聽《我...
摘要:自定義注解不生效原因解析及解決方法背景項目中,自己基于實現了一套緩存注解。但是最近出現一種情況緩存竟然沒有生效,大量請求被擊穿到層,導致壓力過大。至此,問題得到解決。 自定義注解不生效原因解析及解決方法 背景: 項目中,自己基于spring AOP實現了一套java緩存注解。但是最近出現一種情況:緩存竟然沒有生效,大量請求被擊穿到db層,導致db壓力過大。現在我們看一下具體代碼情形(代...
摘要:的面向的異常遵從通用的異常層次結構。比如以前常用的框架,現在常用的框架包含許多項目,下面挑一些最常用的出來總結一下。狀態是流程中事件發生的地點,在流程中通過轉移的方式從一個狀態到另一個狀態,流程的當前狀況稱為流程數據。 如今做Java尤其是web幾乎是避免不了和Spring打交道了,但是Spring是這樣的大而全,新鮮名詞不斷產生,學起來給人一種凌亂的感覺,我就在這里總結一下,理順頭緒...
閱讀 3045·2021-10-12 10:12
閱讀 5349·2021-09-26 10:20
閱讀 1515·2021-07-26 23:38
閱讀 2807·2019-08-30 15:54
閱讀 1636·2019-08-30 13:45
閱讀 1953·2019-08-30 11:23
閱讀 3078·2019-08-29 13:49
閱讀 819·2019-08-26 18:23