背景
项目中采用的是JDK切面动态代理,切面的方式采用注解切面,需要切某个服务类的方法里面二次调用的方法。
问题处理过程
检查依赖 --- 有
<!-- spring 的面向切面编程,提供AOP(面向切面编程)实现 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- spring 提供对AspectJ 框架的整合--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${org.springframework.version}</version> </dependency>
检查包扫描 --没有
可以在启动类添加,也可以单独在切面类添加
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
但是加完还是不行
检查代码结构
service.func1(
this.func2(
this.func3()
) )
@切面注解
void func3(){}
代码调用方式在层层套娃,感觉应该是出现在this这个坑上。查询了JDK动态代理的相关材料。
在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务。是因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而原始对象去调用方法时,是不会再出发代理了。
通过这方面考虑,this实际上和最外部的方法是同一个service对象,切面被覆盖无效了。因为可以考虑把方法单独提取一个新类或者重新获取一个对象实现。
((MzZdjlServiceImpl)AopContext.currentProxy()).saveSpec(mzZdjl);
至此,问题解决。切面和事务都是相通的,都会有这个问题。
Comments | NOTHING