背景

项目中采用的是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);

至此,问题解决。切面和事务都是相通的,都会有这个问题。


Follow your heart ~!