重用切入点表达式
程序员文章站
2022-05-03 12:59:02
...
重用切入点定义
在编写 AspectJ 切面时, 可以直接在通知注解中书写切入点表达式. 但同一个切点表达式可能会在多个通知中重复出现.
在 AspectJ 切面中, 可以通过 @Pointcut 注解将一个切入点声明成简单的方法. 切入点的方法体通常是空的, 因为将切入点定义与应用程序逻辑混在一起是不合理的.
切入点方法的访问控制符同时也控制着这个切入点的可见性. 如果切入点要在多个切面*用, 最好将它们集中在一个公共的类中. 在这种情况下, 它们必须被声明为 public. 在引入这个切入点时, 必须将类名也包括在内. 如果类没有与这个切面放在同一个包中, 还必须包含包名.
其他通知可以通过方法名称引入该切入点.
重用切入点定义示例代码
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 //标识为组件
@Aspect //标识为切面
@Order(3) //指定切面的优先级. 值越小,优先级越高. 标注@Order的切面比不标注@Order切面的优先级高
public class LoggingAspect {
/**
* 通知: 前置 后置 返回 异常 环绕
*/
/**
* 重用切入点表达式
*/
@Pointcut("execution(* com.learn.spring.aspectJ.*.*(..))")
public void suibian(){}
/**
* 前置通知: 在方法执行之前执行.
* JoinPoint:连接点对象 包含了连接点相关的信息:方法名 方法的参数等....
*/
//@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包下的任意类的任意方法 任意参数
//@Before("execution(* com.learn.spring.aspectJ.*.*(..))")
@Before("suibian()")
public void beforeMethod(JoinPoint joinPoint){
//获取方法名:
String methodName = joinPoint.getSignature().getName();
//获取参数
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));
}
}