【问题标题】:Spring AOP Advice Called Twice两次调用 Spring AOP 建议
【发布时间】:2012-07-17 04:39:51
【问题描述】:

出于某种原因,我的 Spring AOP 建议被调用了两次。我检查了:

  1. Spring AOP advice is called twice 但我没有使用 Component 注释,而是声明了一次切面 bean 并用 @Aspect 对其进行了注释,仅此而已。

  2. 有点晚了,我意识到我的一个类还没有实现接口,这导致了 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


【解决方案1】:

好吧,看来这实际上是记录器的问题。今天早上我检查并发现所有内容都被记录了两次。当我用常规的 sysout 调用替换记录器调用时,一切正常。

【讨论】:

  • 谢谢...同样的问题也让我发疯了一段时间!
【解决方案2】:

我遇到了同样的问题。我的双重方面调用是由于我向方面添加了一个父级,并且在父级中的一个方法上有一个@Before 注释,子级在它自己的@Before 中调用。 Parent @Before 被继承为 aop 建议,它也符合我的切入点。因此,除了我从孩子明确调用,即(super.someMethod())之外,我还隐含地在孩子的建议完成执行后立即调用它。在继承的 'someMethod()' 上删除父母 @Before 修复了被调用两次的方面。所以你可以继承建议。长话短说。

【讨论】:

    【解决方案3】:

    重复日志的问题来自 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
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多