重用切入点表达式
重用切入點(diǎn)定義
在編寫(xiě) AspectJ 切面時(shí), 可以直接在通知注解中書(shū)寫(xiě)切入點(diǎn)表達(dá)式. 但同一個(gè)切點(diǎn)表達(dá)式可能會(huì)在多個(gè)通知中重復(fù)出現(xiàn).
在 AspectJ 切面中, 可以通過(guò) @Pointcut 注解將一個(gè)切入點(diǎn)聲明成簡(jiǎn)單的方法. 切入點(diǎn)的方法體通常是空的, 因?yàn)閷⑶腥朦c(diǎn)定義與應(yīng)用程序邏輯混在一起是不合理的.
切入點(diǎn)方法的訪問(wèn)控制符同時(shí)也控制著這個(gè)切入點(diǎn)的可見(jiàn)性. 如果切入點(diǎn)要在多個(gè)切面中共用, 最好將它們集中在一個(gè)公共的類(lèi)中. 在這種情況下, 它們必須被聲明為 public. 在引入這個(gè)切入點(diǎn)時(shí), 必須將類(lèi)名也包括在內(nèi). 如果類(lèi)沒(méi)有與這個(gè)切面放在同一個(gè)包中, 還必須包含包名.
其他通知可以通過(guò)方法名稱(chēng)引入該切入點(diǎn).
重用切入點(diǎn)定義示例代碼
package com.learn.spring.aspectJ;import java.util.Arrays;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;/*** 日志切面*/ @Component //標(biāo)識(shí)為組件 @Aspect //標(biāo)識(shí)為切面 @Order(3) //指定切面的優(yōu)先級(jí). 值越小,優(yōu)先級(jí)越高. 標(biāo)注@Order的切面比不標(biāo)注@Order切面的優(yōu)先級(jí)高 public class LoggingAspect {/*** 通知: 前置 后置 返回 異常 環(huán)繞*//*** 重用切入點(diǎn)表達(dá)式*/@Pointcut("execution(* com.learn.spring.aspectJ.*.*(..))")public void suibian(){}/*** 前置通知: 在方法執(zhí)行之前執(zhí)行.* JoinPoint:連接點(diǎn)對(duì)象 包含了連接點(diǎn)相關(guān)的信息:方法名 方法的參數(shù)等....*///@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.add(int,int))")//@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.*(int,int))")//任意修飾符任意返回值 com.learn.spring.aspectJ包下的任意類(lèi)的任意方法 任意參數(shù)//@Before("execution(* com.learn.spring.aspectJ.*.*(..))")@Before("suibian()")public void beforeMethod(JoinPoint joinPoint){//獲取方法名:String methodName = joinPoint.getSignature().getName();//獲取參數(shù)Object [] args = joinPoint.getArgs();System.out.println("The method "+methodName+" begins with "+ Arrays.asList(args));}} package com.learn.spring.aspectJ;import java.util.Arrays;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;@Component @Aspect @Order(2) public class ValidatorAspect {//@Before("execution(* com.learn.spring.aspectJ.*.*(..))")@Before("com.learn.spring.aspectJ.LoggingAspect.suibian()")public void beforeMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();Object [] args = joinPoint.getArgs();System.out.println("Validator===>The method "+methodName+" begins with" + Arrays.asList(args));} }?
總結(jié)
- 上一篇: 指定切面的优先级
- 下一篇: 基于xml的方式配置AOP