Spring AOP 中@Pointcut的用法(多个Pointcut)

Spring AOP 中@Pointcut的用法(多个Pointcut)

/**
swagger切面,分开来写
**/
@Aspect
@Component
public class ApiOperationLogAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("@annotation(io.swagger.annotations.ApiOperation)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) {
    
    }    
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FunctionLog {
    String value() default "";
}

/**
自定义切面,分开来写
**/
@Aspect
@Component
public class FunctionLogAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("@annotation(com.mytest.insure.annotation.FunctionLog)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) {
    
    }
}

Spring Boot AOP @Pointcut拦截注解的表达式与运算符
拦截注解的表达式有3种:@annotation、@within、@target
1、@annotation
匹配有指定注解的方法(注解作用在方法上面)
2、@within
匹配包含某个注解的类(注解作用在类上面)
3、@target
匹配目标对象有指定注解的类(注解作用在类上面)
@target 和@within的区别:
1、@target(注解A):判断被调用的目标对象中是否声明了注解A,如果有,会被拦截;
2、@within(注解A): 判断被调用的方法所属的类中是否声明了注解A,如果有,会被拦截;
3、@target关注的是被调用的对象,@within关注的是调用的方法所在的类;
@PointCut中的运算符
PointCut中可以使用&&、||、! 运算符

同时匹配方法上的和类上的注解
@Pointcut("@annotation(com.test.aop.demo.MyAnnotation) || @within(com.test.aop.demo.MyAnnotation)")
public void cutController(){
}
或者
@Pointcut("@annotation(com.test.aop.demo.MyAnnotation)")
public void cutController(){
}

@Pointcut("@within(com.test.aop.demo.MyAnnotation)")
public void cutService(){
}

@Pointcut("cutController() || cutService()")
public void cutAll(){
}

posted on 2024-01-15 19:10  oktokeep  阅读(1226)  评论(0编辑  收藏  举报