【发布时间】:2012-07-17 04:39:51
【问题描述】:
出于某种原因,我的 Spring AOP 建议被调用了两次。我检查了:
Spring AOP advice is called twice 但我没有使用 Component 注释,而是声明了一次切面 bean 并用 @Aspect 对其进行了注释,仅此而已。
有点晚了,我意识到我的一个类还没有实现接口,这导致了 CGLIB2 要求。我解决了这个问题,CGLIB2 问题消失了,但双重调用仍然存在。
编辑:
忘了说我查过了,提示的方法没有被调用两次。
第二次编辑:
我用@Aspect 声明一个类,然后在应用程序上下文中将它声明为一个bean。 XML 文件中没有建议或切入点。
第三次编辑:
另外值得注意的是,我在执行周围建议的方法之前和之后记录:
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))")
有什么想法吗?
谢谢,
浮潜
【问题讨论】:
-
您在扫描包裹吗?您说您要声明一次方面 bean(在 xml 中?),然后还要对其进行注释。这会导致双重调用。
-
我正在使用
, 然后我有一个带有实现建议的类的 bean。 AFAIK,这些是最小的步骤。谢谢! -
如果您的通知被调用了两次,但只调用了一个方法,您是否有可能调用了两种不同的方法?
-
想到了这一点,这就是为什么我将切入点应用于特定方法,通过名称调用参数和返回码。
-
您确定这是被调用两次的建议,还是您的日志配置导致消息被打印两次(例如,如果您已将附加程序显式附加到根记录器和 @987654325 @logger 然后您可能会发现一个
log.info调用会导致打印两条相同的消息)。您可以通过在“之前”和proceed之间的建议中添加第二个log.info来检查这一点,并查看它是否按照AABB(双重记录)或ABAB(建议调用两次)的顺序打印消息。
标签: java spring aop spring-aop