我在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定义一个切入点,但同样的事情发生了。我也尝试指定(..))的类型。
在我的系绳尽头试图让它发挥作用时,请有人向我推进正确的方向。
感谢。
答案 0 :(得分:0)
Spring不应该多次处理方面。检查您是否在该类之上使用@component或@service。如果是,请删除它们并查看。还可以玩@EnableJAutoproxy。可能是创建了两个代理,因此方面执行了两次。另外,检查是否从类的另一个兄弟方法调用带注释的方法。这可能也有问题。