出于某种原因,我的Spring AOP建议被调用了两次。我查了一下:
Spring AOP advice is called twice但是我没有使用Component注释,并且声明了aspect bean一次并使用@Aspect注释它就是这样。
有点迟了一点,我意识到我的一个类还没有实现一个接口,这导致了CGLIB2的要求。我解决了这个问题,并且CGLIB2问题消失了,但双重调用仍然存在。
编辑:
忘记提及我检查了,建议的方法没有被调用两次。
第二次编辑:
我使用@Aspect声明了一个类,然后在应用程序上下文中将其声明为bean。 XML文件中没有建议或切入点。
第3次编辑:
另外值得注意的是,我在使用Around:
建议的方法执行之前和之后进行登录log.info("before");
pjp.proceed();
log.info("after");
我看到的是:
before
before
after
after
这真的很奇怪。
对于我设置的@Before和@Around建议都会发生这种情况。我还没有尝试其他类型。
这是切入点声明,名称已更改:
@Around("execution(public java.util.List<java.lang.String> pac.age.names.myDAO.doSomething(java.lang.String, java.lang.String))")
有什么想法吗?
谢谢,
呼吸管
答案 0 :(得分:3)
嗯,看起来这实际上是记录器的一个问题。今天早上我查了一下,发现一切都被记录了两次。当我用常规的sysout调用替换记录器调用时,一切正常。
答案 1 :(得分:0)
我有同样的问题。我的两次方面调用是由于我在方面中添加了一个父级,并且还对该子级在其自己的@Before中调用的父级中的方法上添加了@Before注释。 Parent @Before被作为aop建议继承,这也与我的切入点匹配。因此,除了我从孩子那里明确调用即即(super.someMethod())外,我还隐式地在孩子的建议完成执行后立即调用它。在继承的“ someMethod()”上删除父项@Before修复了两次被调用的方面。这样您就可以继承建议。长话短说。
答案 2 :(得分:0)
重复日志的问题来自于 Logger 实现的“可加性”属性。 您可以使用 additivity=false(在 XML 或 .property 文件中)配置记录器。
log4j2.logger.youraspect-logging.name=your.package.YourAspect
log4j2.logger.youraspect-logging.level=debug
log4j2.logger.youraspect-logging.appenderRef.stdout.ref=STDOUT
log4j2.logger.youraspect-logging.additivity=false