Java AOP建议在第一个切入点之外调用了两次

Java AOP建议在第一个切入点之外调用了两次,java,spring,aop,aspectj,pointcut,Java,Spring,Aop,Aspectj,Pointcut,我在JavaSpring应用程序中使用基于注释的AOP。根本没有XML配置(除了log4j2.XML) 我的第一个切入点按预期执行一次,但之后的每个切入点都会执行两次,我不知道为什么 这是我的配置类: @Configuration @EnableAspectJAutoProxy public class LoggingConfig { @Bean public PreProcessLogs preProcessLogs(){ return new PreProcessLo

我在JavaSpring应用程序中使用基于注释的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");
    }
}
@方面
公共类预处理日志
{
@在(“执行(*.preprocessor.services.DownloadService.addToDownloading(..)”+“&&args(事件)”之前)
public void LogFTPFile(JoinPoint JoinPoint,WatchEvent事件){
Logger Logger=(org.apache.logging.log4j.core.Logger)LogManager.getLogger(joinPoint.getSignature().getDeclaringTypeName());
logger.log(Level.INFO,event.context().toString()+“已出现在FTP中\n”);
}
@返回后(“执行(void.preprocessor.services.DownloadService.addtodownload(..)”+“&&args(filePath)”)
public void logdownloaddedfile(JoinPoint JoinPoint,Path filePath){
//Logger Logger=(org.apache.logging.log4j.core.Logger)LogManager.getLogger(joinPoint.getSignature().getDeclaringTypeName());
//logger.log(Level.INFO,file.getFileName()+“已完成下载”);
//System.out.println(joinPoint.getSourceLocation());
System.out.println(filePath.getFileName()+“已下载”);
}
@之后(“执行(void.preprocessor.services.FileTransferService.moveToStagingFolder(..)”+“&&args(文件)”)
公共无效日志文件传输(JoinPoint jp,路径文件){
System.out.println(file.getFileName()+“已移动到临时文件夹”);
}
}
所以基本上,@AfterReturning和@After切入点执行两次而不是一次。@Before注释按预期执行一次。我曾经尝试过@和底部的两个切入点,但效果相同。我还尝试使用@pointcut定义一个切入点,但同样的情况也发生了。我还尝试指定(…)所在的类型

在我力所能及的时候,请有人把我推向正确的方向


谢谢。

Spring不应该多次处理方面。检查类的顶部是否有@component或@service。如果是,请将其拆下并查看。还可以使用@EnableJAutoproxy。可能创建了两个代理,因此aspect执行了两次。另外,检查是否正在从类的另一个同级方法调用带注释的方法。这可能也有问题。

没有额外的@component或@service,您可以在上面的代码中看到这一点。我如何使用@EnableJAutoProxy?我的代码中没有任何子类。加上第一个切入点按预期执行了一次,但最后两个切入点执行了两次。第二个、第三个方法是从第一个调用的吗?检查如果删除那些“同级”方法调用并从其他地方调用第2/3个方法会发生什么。你还会被执行两次死刑吗?不,他们不会执行两次(除非有人也打了两次电话),你只会认为他们会。但是,如果没有目标代码,就无法对其进行分析。因此,请提供一个包含方面+应用程序代码,包括类和包名称。我投票结束这个问题,因为它缺乏必要的复制问题。