Spring AOP建议称为两次

时间:2012-07-17 04:39:51

标签: java spring aop spring-aop

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

  1. Spring AOP advice is called twice但是我没有使用Component注释,并且声明了aspect bean一次并使用@Aspect注释它就是这样。

  2. 有点迟了一点,我意识到我的一个类还没有实现一个接口,这导致了CGLIB2的要求。我解决了这个问题,并且CGLIB2问题消失了,但双重调用仍然存在。

  3. 编辑:

    忘记提及我检查了,建议的方法没有被调用两次。

    第二次编辑:

    我使用@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))")
    

    有什么想法吗?

    谢谢,

    呼吸管

3 个答案:

答案 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