Spring AOP对嵌套方法不起作用

来源:互联网 发布:什么是共和 知乎 编辑:程序博客网 时间:2024/06/06 14:22

今天在调研系统操作记录日志时,好多教程都是借助于Spring AOP机制来实现。于是也采用这种方法来实现。在Service中的删除日志方法上注解自定义的切点,但是执行没有生效。代码如下:

//尝试删除溢出日志    public synchronized void tryDelOverflowLog() {        logNum++;        if (logNum - LogConst.MAX_NUM > 0) {            int delNum = logNum - LogConst.MAX_NUM + LogConst.EXTRA_NUM;            logNum -= delNum;            removeOverflowLog(delNum);        }    }    //日志溢出后,删除最新入库的日志    @ServiceLog(type = LogConst.TYPE_LOG_RECORD, description = "操作日志缓存区溢出,系统自动清空缓存区")    public void removeOverflowLog(int delNum) {        custLogMapper.removeOverflowLog(delNum);    }

在使用 Spring AOP 的时候,我们从 IOC 容器中获取的 Service Bean 对象其实都是代理对象,而不是那些 Service Bean 对象本身,也就是说获取的并不是被代理对象或代理目标。当我在自己的 Service 类中使用 this 关键字嵌套调用同类中的其他方法时,由于 this 关键字引用的并不是该 Service Bean 对象的代理对象,而是其本身,故 Spring AOP 是不能拦截到这些被嵌套调用的方法的。

要解决这个问题,最简单的方法是把自身注入到自身,用注入的这个自身去调用本方法。或者你也可以不用spring aop而是用aspectj weaving,倒是可以测底的解决该问题。我采用的是把自身注入到自身中。

    /**     * 通过注入自身解决,Spring AOP嵌套调用不生效的问题     */    @Autowired    private ApplicationContext applicationContext;    private LogService self;    @PostConstruct    private void init() {        self = (LogService) applicationContext.getBean("logService");    }
   //尝试删除溢出日志    public synchronized void tryDelOverflowLog() {        logNum++;        if (logNum - LogConst.MAX_NUM > 0) {            int delNum = logNum - LogConst.MAX_NUM + LogConst.EXTRA_NUM;            logNum -= delNum;            self.removeOverflowLog(delNum);        }    }


参考:

http://blog.51cto.com/huqilong/732088


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 棕榈油 进口 棕榈油好吗 棕榈油走势 棕榈油 代可可脂 棕榈油硬脂 毛棕榈油价格 棕榈油哪有卖 期货棕榈油 求购棕榈油 棕榈油能吃吗 棕榈油 大豆油 棕榈油进口商 国内棕榈油现货价格 酸化棕榈油 口福棕榈油 棕榈油精炼设备 国内棕榈油价格 供应棕榈油 氢化棕榈油的危害 棕榈油进口量 工业棕榈油价格 国内棕榈油库存 棕榈油酸化油 棕榈油进口企业 棕榈油油炸 棕榈油套利 棕榈油网 调和油 棕榈油 棕榈油能食用吗 棕榈油进口价 棕榈油 期货 棕榈油粕 棕榈油椰子油 椰子油棕榈油 棕榈油功效 椰子油 棕榈油 棕榈油1405 棕油 棕油价格行情 棕油价格 棕榈泉国际中心