0
点赞
收藏
分享

微信扫一扫

@Transactional注解的使用禁忌

Spring的AOP是基于动态代理机制实现的。关于AOP Spring官方网站有这样一段描述:

大致意思是:Spring AOP机制默认基于JDK 动态代理来实现也可以设置基于CGLib动态代理来实现。
我们知道JDK动态代理类,通过继承和被代理类相同的Interface来实现对原有方法的调用和增强。而CGLib动态代理类,则通过继承被代理类的方式实现对原有方法的调用和增强。
Spring 注解类(包含Transactional)都是基于Spring AOP机制实现的。这里引出Transactional使用的禁忌(也是其它注解的使用禁忌):

1. 不建议将Transactional标注在Interface上

Transactional注解即可以注在在Interface的方法上。又可以写在具体的Class上。而如果标注在Interface上且配置Spring AOP使用CGLib动态代理。会导致Transactional失效。原因看上面分析。

2.不能将Transactional标注在private、protected方法上

Transactional 标签必须标注在public修饰的方法上,否则Transactional同样不生效。

3. 不能将Transactional标注在内部调用的方法上

Transactional必须标注在给外部调用的接口上。如:不带Transactional注解的方法a,调用带有Transactional注解的方法b,事务同样不生效。

public class Demo {
public void a(){
b();
}
@Transactional
public void b(){
}

以上几条禁忌同样适用于Spring的其它注解

举报

相关推荐

0 条评论