【发布时间】:2018-05-02 16:26:25
【问题描述】:
我在我的 Java Spring 应用程序中使用基于注解的 AOP。根本没有 XML 配置(除了 log4j2.xml)。
我的第一个切入点按预期执行一次,但之后的每个切入点都会执行两次,我不知道为什么。
这是我的配置类:
@Configuration @EnableAspectJAutoProxy
public class LoggingConfig
{
@Bean public PreProcessLogs preProcessLogs(){
return new PreProcessLogs();
}
}
以及 Aspect 类:
@Aspect
public class PreProcessLogs
{
@Before("execution(* <package>.preprocessor.services.DownloadService.addToDownloading(..)) " + "&& args(event)")
public void LogFTPFile(JoinPoint joinPoint, WatchEvent<?> event) {
Logger logger = (org.apache.logging.log4j.core.Logger) LogManager.getLogger(joinPoint.getSignature().getDeclaringTypeName());
logger.log(Level.INFO, event.context().toString() + " has appeared in the FTP\n");
}
@AfterReturning("execution(void <package>.preprocessor.services.DownloadService.addToDownloaded(..)) " + "&& args(filePath)")
public void logDownloadedFile(JoinPoint joinPoint, Path filePath) {
//Logger logger = (org.apache.logging.log4j.core.Logger) LogManager.getLogger(joinPoint.getSignature().getDeclaringTypeName());
//logger.log(Level.INFO, file.getFileName() + " has finished downloading");
//System.out.println(joinPoint.getSourceLocation());
System.out.println(filePath.getFileName() +" has been downloaded");
}
@After("execution(void <package>.preprocessor.services.FileTransferService.moveToStagingFolder(..)) " + "&& args(file)")
public void logFileTransfer(JoinPoint jp, Path file) {
System.out.println(file.getFileName() + " has been moved to the Staging Folder");
}
}
所以基本上@AfterReturning 和@After 切入点被执行两次而不是一次。 @Before 注释按预期执行一次。我用底部的两个切入点尝试了@Before,但效果相同。我也尝试使用@Pointcut 定义切入点,但同样的事情发生了。我还尝试指定 (..)) 所在的类型。
在我试图让它发挥作用的束缚结束时,请有人将我推向正确的方向。
谢谢。
【问题讨论】:
-
不,它们不会执行两次(除非有人也调用了两次),您只是认为它们会执行。但是没有目标代码是无法分析的。所以请提供一个MCVE,包括方面+应用程序代码,包括。类和包名。
-
我投票结束这个问题,因为它缺少重现问题所必需的minimal reproducible example。
标签: java spring aop aspectj pointcut