AOP建议除了第一次切入点之外还有两次

时间:2018-05-02 16:26:26

标签: java spring aop aspectj pointcut

我在Java Spring Application中使用基于注释的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定义一个切入点,但同样的事情发生了。我也尝试指定(..))的类型。

在我的系绳尽头试图让它发挥作用时,请有人向我推进正确的方向。

感谢。

1 个答案:

答案 0 :(得分:0)

Spring不应该多次处理方面。检查您是否在该类之上使用@component或@service。如果是,请删除它们并查看。还可以玩@EnableJAutoproxy。可能是创建了两个代理,因此方面执行了两次。另外,检查是否从类的另一个兄弟方法调用带注释的方法。这可能也有问题。