背景
需要项目原切面的基础上排除一些类中方法。
本篇文章主要介绍了SpringBoot AOP @Pointcut切入点表达式,以及如何排除某些类中的方法的方式。
 
execution(* com.winup.web.controller..*.*(..))
参数说明
| 符号 | 含义 | 
| execution() | 表达式的主体; | 
| 第一个”*“符号 | 表示返回值的类型任意; | 
| com.sample.service.impl | AOP所切的服务的包名 | 
| 包名后面的”..“ | 表示当前包及子包 | 
| 第二个”*“符号 | 表示类名,*即所有类 | 
| .*(..) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 | 
AspectJ中的exection表达式
基本语法格式为: execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?) 
- 修饰符匹配(modifier-pattern?)
- 返回值匹配(ret-type-pattern):可以为*,表示任何返回值,全路径的类名等
- 类路径匹配(declaring-type-pattern?)
- 方法名匹配(name-pattern):可以指定方法名 或者*,代表所有。- set*, 代表以- set开头的所有方法
 
- 参数匹配((param-pattern)):可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“*”来表示匹配任意类型的参数- String表示匹配一个- String参数的方法;
- *,String表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;
- 可以用..表示零个或多个任意参数
 
- 异常类型匹配(throws-pattern?)
其中后面跟着“?”的是可选项。除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。
@Pointcut切入点排除某一些类或者方法不进行拦截
	// 扫描controller层
    @Pointcut("execution(* com.winup.web.controller..*.*(..)) ")
    public void runningLogPointcat() {
    }
    // 排除controller类
    @Pointcut("execution(* com.winup.web.controller.TempController.*(..)) ")
    public void excludePointcut() {
    }
    //切面配置
    @AfterReturning("runningLogPointcat() && !excludePointcut()")
    public void saveSysLog(JoinPoint joinPoint) throws IOException {
        String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
	    String methodName = joinPoint.getSignature().getName();
	    logger.info("{}.{} start", className, methodName);
	}
-  runningLogPointcat:切入点为controller下所有类。
-  excludePointcut:切入点为controller下TempController类。
-  saveSysLog:切入点为满足runningLogPointcat且不满足excludePointcut的切入点的范围







![[Java]JavaWeb学习笔记(尚硅谷2020旧版)](https://img-blog.csdnimg.cn/fc449f80dd474e5abf929d0afeee6a2a.png)











