这个问题是在一次采访中问我的。
class A{
@Transactional
public void test1(){
test2();
}
@Transactional(propagation = REQUIRED.NEW)
public void test2(){}
class B extends A{
public void test1(){
super.test1();
}他问我要创建多少事务对象?答案是1,而不是2。现在我很难与这部分作斗争。他说这就是CgLib代理的工作方式,有人能解释一下这个部分吗?
发布于 2022-04-28 21:48:51
这个程序可以重写如下:
class A{
@Transactional
public void test1(){
this.test2(); // this is added
}
@Transactional(propagation = REQUIRED.NEW)
public void test2(){}
class B extends A{
public void test1(){
super.test1();
}假设您从应用程序上下文中获得A,并对其调用test1()方法:
var a = context.getBean(A.class);
a.test1()我们知道a实际上是代理对象,因此将创建一个事务。在test1()方法中,我们称之为this.test2()方法。
Spring:
但是,一旦调用最终到达目标对象,它可能对自己进行的任何方法调用(如this.bar()或this.foo() )都将针对该引用而不是对代理调用。
因此,对于test2()方法,不会创建任何事务,因为这是针对A类调用的,而不是所有事务性内容支持的代理类。
现在假设您从应用程序上下文中获取B,并对其调用test1()方法。
var b = context.getBean(B.class);
b.test1()因为B是A的子类,而A是使用事务处理进行注释的,所以B本身是一个代理(即使B中的test1()没有用@Transactional注释,但test1()是自动继承的)。因此,将创建一个事务。当我们到达目标对象时,所有事务都会消失,不会像第一种情况那样创建更多的事务。
https://stackoverflow.com/questions/72047587
复制相似问题