AspectJ - 包中除一个之外的所有 类 的切入点

AspectJ - Pointcut for all classes in a package except one

我目前正在一个方法上使用以下切入点,记录对我的应用程序中每个服务方法的调用:

@Before("execution(* com.mdenis.someAppName..service..*(..))")

有问题的方法使用 Apache 记录器并且工作完美。我现在希望将这些日志记录语句也写入数据库(通过 LogEntryService class)。问题在于,这实际上是在创建 Whosebug 错误,因为记录服务包中所有内容的方法正在调用同一包内的方法。

有没有办法更改我的切入点以排除某个 class?

这个怎么样?

@Before(
  "execution(* com.mdenis.someAppName..service..*(..)) && " + 
  "!within(*..LogEntryService)"
)

我最终将 class 切入点与注释切入点结合起来,如下所示:

@Pointcut("execution(* com.service.processes.communication.CommunicationProcess.*(..))")
private void communicationMethods() {}

@Pointcut("execution(@com.lib.annotation.Loggable * *.*(..))")
private void loggableMethods() {}

@Before("communicationMethods() && loggableMethods()")
public void logMethodCallWithParameters(JoinPoint joinPoint)
{
    if (joinPoint.getArgs().length == 0)
    {
        logEntryService.logDebug(LogEntrySource.SERVICE, LogEntryType.MESSAGING, "Method " + joinPoint.getTarget().getClass().getCanonicalName() 
            + "." + joinPoint.getSignature().getName() + " called with no argument", logger);
    }
    else
    {
        logEntryService.logDebug(LogEntrySource.SERVICE, LogEntryType.MESSAGING, "Method " + joinPoint.getTarget().getClass().getCanonicalName() 
            + "." + joinPoint.getSignature().getName() + " called with argument(s) " + getArgumentString(joinPoint.getArgs()), logger);
    }
}