SpringBoot AOP @Pointcut切入點表達式排除某些類方式

SpringBoot AOP @Pointcut切入點表達式排除某些類

場景

希望給service包下的所有public方法添加開始和結束的info log,但是需要排除和數據庫相關的service

其他博文都推薦瞭

@Pointcut("execution(* com.demo.service.*.*(..)) && !execution(* com.demo.service.dbservice.*(..)) ") 

類似的用法,但是在實際操作中,發現&&這個關鍵字無法使用,隻能使用and才能編譯通過,並且@Pointcut隻識別瞭前面半句表達式,and(&&)之後的內容被無視瞭。

使用以下方法滿足瞭開發需求

    @Pointcut("execution(public * com.demo.service.*.*(..))")
    public void serviceMethods() {
    }
 
    @Pointcut("execution(public * com.demo.service.dbservice.*(..))")
    public void serviceMethods2() {
    }
 
    @Pointcut("serviceMethods() && !serviceMethods2()")
    public void serviceMethods3() {
    }
 
    @Before("serviceMethods3()")
    public void startLog(JoinPoint joinPoint) {
        String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
        String methodName = joinPoint.getSignature().getName();
        logger.info("{}.{} start", className, methodName);
    }

AOP排除某些類型不攔截

/**
 * 日志記錄切面
 */
@Aspect
public class Logger implements ILogger {
 @Resource(name="logService")
 private LogService logService ;
 
 @Pointcut("execution(* *..*Action*.*(..)) && !execution(* com.audaque.tjfxpt.web.sjcx.LogAction.*(..))")
 public void actionPointCut() {
 }

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: