AspectJ-包中所有类的切入点

时间:2019-01-31 17:38:27

标签: java class spring-boot package aspectj

我当前在一种方法上使用以下切入点,该方法将对应用程序中每个服务方法的调用记录到日志:

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

有问题的方法使用Apache记录器,并且运行完美。现在,我也希望这些日志记录语句也可以通过LogEntryService类写入数据库。问题在于,这实际上是在造成StackOverflow错误,因为记录服务包中所有内容的方法正在调用同一包内的方法。

是否可以更改切入点以排除某个类?

2 个答案:

答案 0 :(得分:0)

怎么样?

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

答案 1 :(得分:0)

我最终将类切入点与注释切入点组合在一起,例如:

@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);
    }
}