Spring如何实现事务
Spring的核心是IOC和AOP(Aspect Oriented Programming)。AOP是面向切面编程,使用动态代理技术,动态代理内部实现用的是反射。
Spring的事务是通过aop来实现的。
Spring的代理模式有两种:java自带的动态代理模式和cglib代理模式
问题代码模型
抽象类:
public abstract class abstractTemplate {
@Autowired
private TestService service;
public abstract void funService(InputRequest request);
public final void execute(InputRequest request) {
funService(request);
}
}
实现类:
@Service
public class EntityClass extends abstractTemplate {
@Transactional(rollbackFor = Exception.class)
public void funService(InputRequest request) {
//do some thing
}
}
问题原因
事务依赖动态代理
final导致动态代理失效
百度的看到一篇介绍的好文章:
我看过spring事务的源码,就会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。
但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而无法添加事务功能。
注意:如果某个方法是static的,同样无法通过动态代理,变成事务方法。
大佬原文地址:
作者:首席架构师专栏
链接:https://www.jianshu.com/p/866ca9210e21