问题:项目中用到了AOP方式记录日志,对于所有create开头的方法全部做了拦截。现在有一个类,里面有createFile方法和newFolder方法,newFolder方法里面会调用到createFile方法,但此时,createFile的拦截记录日志却起不到作用,这是为什么呢。
缘由:Spring的AOP实现方式有两种:Java动态代理和Cglib动态增强,这两种方式在Spring中是可以无缝自由切换的。Cglib方式增强的AOP目标类,会创建两个对象,一个是Bean实例本身,一个是Cglib增强代理对象。Spring通过AopProxy接口,抽象了这两种实现,实现了一致的AOP方式。但是这种抽象带了一个缺陷,那就是扼杀了Cglib能够直接创建普通类的增强子类的能力,Spring相当于把Cglib动态生成的子类,当普通的代理类了。回到问题上就是:newFolder方法经过AopProxy给过滤掉,方法内部调用createFile,虽然配置了方法拦截,但是因为是内部调用,AopProxy感知不到,因此拦截日志起不到作用。
延伸:这个问题,可以延伸到同样AOP性质的声明式事务。如果createFile配置了事务,但是newFolder没有配置,同理,newFolder方法内的createFile并不会开启事务,假设createFile被调用了3次,第三次产生错误,事务并不能正常的回滚了。因此可以认为:
内部调用时,被调用方法的事务声明将不起作用;同样事务的传播策略在内部方法调用时将不起作用
解决:这个东西我没想到什么好方法改变,只能避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务。
分享到:
相关推荐
spring aop jar 包
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
springAOP 4个jar包
spring aop的demo spring aop的demo
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二...
Spring aop Spring aop
springAOP详解
spring aop依赖包,想要的可以下,我用的spring 3.1,其他版本的不知道支不支持。
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
Spring AOP简单demo 入门级的 advice
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包
spring aop 经典例子(原创),无论新手还是老手,可以快速对Spring AOP有个总体的认识。基于JDK1.6,Spring2.0.5,Eclipse IDE。
NULL 博文链接:https://306963591.iteye.com/blog/1129837
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927