Java: 从私有方法调用 public 事务方法
Java: calling public transactional method from a private method
我有两个 classes
public class MyTest {
@Autowired
private MyService myService;
private void test() {
myService.writeToDb();
}
}
@Service
public class MyService {
@Transactional
public void writeToDb() {
// do db related stuff
}
}
我想知道从 MyTest class 调用方法 test()(这是一个 private 方法)是否会创建一个事务。
P.S
我正在使用 Spring Boot。和 Java 17.
它会起作用,无论您是从 public 调用另一个对象的方法还是从您内部的私有方法调用都是一个实现细节。从被调用者的角度来看,它是一样的,它甚至不知道调用者的上下文。
Spring AOP 使用 the Proxy pattern 来处理这些场景。这意味着您不是直接接收一个 MyService
bean,而是一个 MyServiceSpringCreatedProxy
(不是实际名称,在调试模式下检查,您会看到),它实际上是在处理围绕方法的事务。
因此,只要调用通过 Spring 的代理,@Transactional
就会按预期进行计算。请记住,这并不意味着打开了一个新事务,这取决于另一个事务是否已经存在以及您的配置。
但是,任何自调用(对 public 或私有方法)都不会通过代理,然后 @Transactional
将无法工作。
@Service
public class MyService {
// can be private, public or whatever
public void callRelatedStuff() {
//self call, no transactional work done
writeToDb();
}
@Transactional
public void writeToDb() {
// do db related stuff
}
}
我有两个 classes
public class MyTest {
@Autowired
private MyService myService;
private void test() {
myService.writeToDb();
}
}
@Service
public class MyService {
@Transactional
public void writeToDb() {
// do db related stuff
}
}
我想知道从 MyTest class 调用方法 test()(这是一个 private 方法)是否会创建一个事务。
P.S
我正在使用 Spring Boot。和 Java 17.
它会起作用,无论您是从 public 调用另一个对象的方法还是从您内部的私有方法调用都是一个实现细节。从被调用者的角度来看,它是一样的,它甚至不知道调用者的上下文。
Spring AOP 使用 the Proxy pattern 来处理这些场景。这意味着您不是直接接收一个 MyService
bean,而是一个 MyServiceSpringCreatedProxy
(不是实际名称,在调试模式下检查,您会看到),它实际上是在处理围绕方法的事务。
因此,只要调用通过 Spring 的代理,@Transactional
就会按预期进行计算。请记住,这并不意味着打开了一个新事务,这取决于另一个事务是否已经存在以及您的配置。
但是,任何自调用(对 public 或私有方法)都不会通过代理,然后 @Transactional
将无法工作。
@Service
public class MyService {
// can be private, public or whatever
public void callRelatedStuff() {
//self call, no transactional work done
writeToDb();
}
@Transactional
public void writeToDb() {
// do db related stuff
}
}