配置了 Spring AOP 但会调用两次的问题解决方法

标签: spring aop
1077人阅读 评论(0) 收藏 举报
分类:

1 发现问题

项目配置了 Spring AOP,但会被调用两次:

开始
before()
[2017-07-26 11:10:18.071] [INFO]:[com.deniro.jail.service.sys.SysLogAspect][log] [com.deniro.jail.service.sys.SysLogAspect.log(SysLogAspect.java:43)] [调用方法:void com.deniro.jail.service.biz.DictItemService.save(DictItem);输入参数:[com.deniro.jail.domain.biz.DictItem@4f55a864[dictItemId=<null>,dictItemType=health,dictItemDescription=1,dictItemValue=1,dictItemIsOptional=true,createTime=2017-07-26 11:10:18.056,modifyTime=2017-07-26 11:10:18.056]]] 
开始
before()
Hibernate: insert into ...
结束
[2017-07-26 11:10:18.141] [INFO]:[com.deniro.jail.service.sys.SysLogAspect][log] [com.deniro.jail.service.sys.SysLogAspect.log(SysLogAspect.java:58)] [输出参数:null;耗时:0:00:00.062] 
结束

2 分析问题

切面定义如下:

@Component
@Aspect
public class SysLogAspect {

    static Logger logger = LoggerFactory.getLogger(SysLogAspect.class);

    @Pointcut("@annotation(com.deniro.jail.domain.sys.SysLog)")
    private void sysLog() {
    }

    /**
     * 记录日志
     *
     * @param pjp
     */
    @Around("sysLog()")
    public Object log(ProceedingJoinPoint pjp) {

        logger.info("调用方法:{};输入参数:{}", pjp.getSignature()
                , pjp
                .getArgs());

        StopWatch sw = new StopWatch();
        sw.start();
        Object o = null;
        try {
            System.out.println("开始");
            o = pjp.proceed();
            System.out.println("结束");
        } catch (Throwable throwable) {
            logger.error("记录日志", throwable);
        }
        sw.stop();
        logger.info("输出参数:{};耗时:{}", o, sw.toString());
        return o;


    }
}

切点用的是注解配置方式,查了一下,只在一个地方定义了这个注解:

@RequestMapping(value = "/save")
@ResponseBody
@SysLog(description = " 保存【字典项】")
public AjaxResponse save(DictItem dictItem) {
    try {
        dictitemService.save(dictItem);
        return AjaxResponse.success();
    } catch (Exception e) {
        return AjaxResponse.fail();
    }
}

怀疑是重复定义的问题,我们找找看。

打开 spring 的 MVC 配置文件:

<!-- 开启对 @Aspect 的支持-->
<aop:aspectj-autoproxy/>

这是第一处定义的地方,如果类配置了 @Aspect,那么这个类会被自动扫描到 spring 框架中。

第二处定义的地方在 spring 框架配置文件:

<!-- 系统日志切面-->
<bean class="com.deniro.jail.service.sys.SysLogAspect"/>

难怪被执行了两次呢O(∩_∩)O~

3 解决问题

删除 spring 框架配置文件中定义的切面 bean,好了,现在一切恢复正常咯O(∩_∩)O~

记住:开启了 @Aspect 配置,而且切面类加了 @Aspect 注解,这时就不需要再对切面类进行配置 XML 配置哦。

查看评论

在VC中实现程序在启动时隐藏

    最近经常见论坛上有人问,程序在启动时如何隐藏。以下是我总结的一些方法,欢迎大家讨论,找出更好的方法。    对于这类问题,大家最容易想到的可能就是在PreCreateWindow中添加cs.s...
  • AttaBoy
  • AttaBoy
  • 2002-03-03 09:18:00
  • 1216

spring aop 执行两次

系统整合了shiro框架后,发现方法本体执行一次,aop执行两次! 经过研究,是因为系统中有两个代理创建器,生成两个代理类导致的。...
  • wangjun5159
  • wangjun5159
  • 2016-07-04 22:14:49
  • 4555

spring AOP执行2次

去掉@Component就可以了。
  • paincupid
  • paincupid
  • 2016-04-19 14:58:27
  • 2452

springAOP advice方法执行两次 解决方法

项目中遇到某个Aspect类中全部advice方法都会执行两次的情况,现在问题记录,供大家参考; 首先将问题所在标出来讲述问题, @Aspect @Component public class...
  • u014396256
  • u014396256
  • 2017-05-26 16:43:51
  • 1048

aop执行两次的原因

JavaConfig方式配置没有此现象,而xml配置出现这样的问题。共同代码如下: package springinaction.chapter4; import org.aspectj.lang...
  • lands92
  • lands92
  • 2018-01-08 15:25:38
  • 132

Spring拦截器执行了两次

Spring拦截器执行了两次 今天在调试代码的时候,发现有个拦截器被执行了两次,很是奇怪,开始以为是即配置了注解的方式,同时又配置了xml配置文件造成的问题,可是仔细检查后并没有配置注解,只配置了x...
  • wgw335363240
  • wgw335363240
  • 2012-07-26 16:05:08
  • 4799

了解Spring @Around使用及注意

了解Spring @Around使用及注意
  • u010137431
  • u010137431
  • 2015-12-23 17:48:07
  • 8323

Spring AOP及MethodInterceptor拦截器实现方法拦截以及切入点函数阻止执行

声明:本博文用于学习总结及工作心得 项目中需要修改IM信息送以及短信发送,要求已离职的人员不呢收到IM信息和短信 因为在项目中各个地方都有使用到短信和IM信息通知;所以想到使用Spring AO...
  • qq_33571718
  • qq_33571718
  • 2016-11-05 17:31:20
  • 2591

Spring AOP 各种拦截方法执行的顺序

AOPImpl.java ================== package salesdepart.service.app; import org.aspectj.lang.annotati...
  • bigtree_3721
  • bigtree_3721
  • 2016-03-01 15:30:10
  • 2250

Spring aop拦截springmvc的controller请求方法,添加日志和统计方法执行时间

系统最近莫名挂了三次,查看log日志没找到原因,因为只有少数功能日志输出,大部分功能都没记录日志。打算通过spring aop来给springmvc的controller层的方法加日志,进入方法,方法...
  • sully2008
  • sully2008
  • 2017-06-18 01:19:40
  • 1446
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 12万+
    积分: 3721
    排名: 1万+
    博客专栏
    最新评论