为什么spring的事务注解@Transaction只能用在public方法上

今天在看spring事务的时候,发现特意有强调@Transaction注解是只能用在public方法上的,但没有说明原因,于是引起了我的好奇心。
在经过我的思考和查阅相关博文确认了原因。

首先,@Transaction一般用在方法上,它只能用在public方法上,那就意味着其不能用在private方法上。于是就可以想一下为什么private方法不可以用用呢?

这时候把思路放到AOP上,spring中很多东西的实现都是依靠AOP,本质上也是依靠代理来实现。事务在spring中的实现其实就是生成bean对象的代理对象。在bean进行创建出实话时, 如果是有事务注解的方法,就会被进行增强,最终形成代理类。

在spring中,有两种动态代理的方式,一种是jdk,它是将原始对象放入代理对象内部,通过调用内含的原始对象来实现原始的业务逻辑,这是一种装饰器模式;而另一种是cglib,它是通过生成原始对象的子类,子类复写父类的方法,从而实现对父类的增强。

jdk中,如果是private的方法,显然是无法访问的,而在cglib中,也是同样,private方法也无法访问。于是原始对象的业务逻辑就丢失了,那么怎么进行增强呢?

于是这个问题实际在于,被aop增强的方法都应该是public的,而不能是private的

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/117636856