当前位置: 首页 > 知识库问答 >
问题:

Spring AOP建议执行了两次

鞠嘉志
2023-03-14

我正在使用SpringAOP创建一个方面。我定义的方面将执行两次。我似乎不明白为什么。我非常感谢任何人对这个问题的意见。

谢谢

//Spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    default-autowire="no"
    default-lazy-init="true">

    <bean id="loggingAdvice" class="com.xyz.aop.LoggingAdvice" />
    <aop:config>
        <aop:aspect id="loggingAspect" ref="loggingAdvice">
            <aop:pointcut id="loggingPointcut"
                expression="execution(* com.xyz.FooServiceImpl.foo(..))"/>
                <aop:around pointcut-ref="loggingPointcut" method="log" />
        </aop:aspect>
    </aop:config>

    <context:component-scan base-package="com.xyz.controllers" />

</beans>

//建议

package com.xyz.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;

public class LoggingAdvice {
    public Object log(final ProceedingJoinPoint pjp) throws Throwable {
        log.info("Started!");
        try {
            return pjp.proceed();
        } finally {
            log.info("Ended!");
        }
    }
}

//建议的方法

package com.xyz;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class FooServiceImpl implements FooService {
    private static final Log log = LogFactory.getLog(FooServiceImpl.class);

    @Override
    public void foo()  {
         log.info("Foo!");
        }
    }
}

//输出

   Started!
   Started!
   Foo!
   Ended!
   Ended!

//编辑1:添加了更多的spring配置信息。根本不使用任何Spring AOP注释。我附加了一个调试器,看到aspect/log语句也被执行了两次。所以我怀疑它是否与日志语句打印字符串两次有关。

共有2个答案

太叔凌龙
2023-03-14

因为代码

柴默
2023-03-14

看来这实际上是记录器的问题。我很久以前遇到过同样的问题,发现所有内容都被记录了两次。当我用常规的sysout调用替换记录器调用时,一切正常。

 类似资料:
  • 我的建议是正确执行并预先准备正确的操作,除了执行两次。我希望它只执行一次。应该触发通知的方法只执行一次,因为startTestSuite标题只在日志中打印一次。bean和上下文是在TestNG类中生成的。我尝试在initSpring()方法上使用@beforeClass和@beforeSuite标记运行它,结果相同。 进一步的上下文:这样做的目的是获取测试套件何时开始和结束的时间戳,以及各个测试何

  • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。

  • 出于某种原因,我的Spring AOP建议被调用了两次。我查过了: > Spring AOP通知被调用了两次,但我没有使用组件注释,我只声明了一次方面bean,并用@aspect注释它,仅此而已。 我用@Aspect声明一个类,然后在应用程序上下文中将它声明为bean。XML文件中没有建议或切入点。 第三次编辑: 还值得注意的是,我在执行方法之前和之后都记录了被告知与周围: 通气管

  • 从HomeActivity我正在尝试从CreateProfileActivity获取结果。在这里我要做什么来开始这个活动 以下是HomeActivity中方法的实现: 当im完成并按下save in后,下面是我将数据发送回HomeActivity的操作: 在上调用setResult方法一次,但由于某种未知原因,当数据到达方法时,get execute两次。第一个结果的和第二个结果的。在此之后,得到

  • 我使用的是aspectj的weaving而不是SpringAOP,因此我的aspectj maven插件如下所示: 我还有另一个方面看起来是这样的: 我需要的是把上面的(集成方面)放在任何其他方面(包括Spring的安全方面)之前,正如您所看到的,我用尝试过(我也用在.aj文件中尝试过),不幸的是,没有成功。

  • 问题内容: 这是一个按钮: 和绑定事件: 一切正常,都发现一件麻烦事,我在Chrome开发者控制台中看到两个请求: 添加/ cartManager: 添加/ cartManager / add ?: 两者的请求标头几乎相同,只是请求标头不同: 第一个是 cartManager / add?pictureId = 等,第二个是 cartManager / add /?pictureId- / add