AOP совет вызывается дважды, кроме первого pointcut - PullRequest
0 голосов
/ 02 мая 2018

Я использую АОП на основе аннотаций в приложении Java Spring. Конфигурация XML вообще отсутствует (кроме log4j2.xml).

Мой первый pointcut выполняется один раз, как и ожидалось, но каждый pointcut после этого будет выполнен дважды, и я не могу понять, почему.

Вот мой класс конфигурации:

@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 Pointcuts выполняются дважды, а не один раз. Аннотация @Before выполняется один раз, как и ожидалось. Я пытался @Before с двумя нижними pointcut, но тот же эффект. Я также попытался определить pointcut с помощью @Pointcut, но происходит то же самое. Я также попытался указать тип, где (..)).

В конце моей привязи, пытаясь заставить это работать, пожалуйста, кто-нибудь подтолкнет меня в правильном направлении.

Спасибо.

1 Ответ

0 голосов
/ 02 мая 2018

Spring не должен обрабатывать аспект несколько раз. Проверьте, есть ли у вас @component или @service в верхней части класса. Если да, удалите их и посмотрите. Также поиграйте с @EnableJAutoproxy. Может быть, что созданы два прокси, следовательно, аспект выполняется дважды. Кроме того, проверьте, вызывается ли аннотированный метод из другого родственного метода класса. Это может быть также проблематично.

...