对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

使用 @Transactional 结合 AspectJ

您也可以通过 AspectJ 切面在 Spring 容器之外使用 Spring 框架的 @Transactional 支持。要做到这一点,首先用 @Transactional 注解您的类(和可选的类的方法),然后将您的应用程序与 org.springframework.transaction.aspectj.AnnotationTransactionAspect 进行链接(编织),该 org.springframework.transaction.aspectj.AnnotationTransactionAspect 定义在 spring-aspects.jar 文件中。您还必须用事务管理器配置该切面。您可以使用 Spring 框架的 IoC 容器来处理该切面的依赖注入。配置事务管理切面的最简单方法是使用 <tx:annotation-driven/> 元素,并如 使用 @Transactional 所述,将 mode 属性指定为 aspectj。由于我们在这里关注的是在 Spring 容器之外运行的应用程序,因此我们将向您展示如何以编程方式实现。spring-doc.cadn.net.cn

在继续之前,您可能想阅读 使用 @TransactionalAOP 分别。

以下示例显示了如何创建事务管理器并配置 AnnotationTransactionAspect 以使用它:spring-doc.cadn.net.cn

// construct an appropriate transaction manager
DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());

// configure the AnnotationTransactionAspect to use it; this must be done before executing any transactional methods
AnnotationTransactionAspect.aspectOf().setTransactionManager(txManager);
// construct an appropriate transaction manager
val txManager = DataSourceTransactionManager(getDataSource())

// configure the AnnotationTransactionAspect to use it; this must be done before executing any transactional methods
AnnotationTransactionAspect.aspectOf().transactionManager = txManager
当使用此切面时,必须对实现类(或该类中的方法,或两者)进行注解,而不是对该类实现的接口(如果有的话)进行注解。AspectJ 遵循 Java 的规则,即接口上的注解不会被继承。

类上的 @Transactional 注解指定了该类中任何公共方法执行时的默认事务语义。spring-doc.cadn.net.cn

方法上的 @Transactional 注解会覆盖类注解提供的默认事务语义(如果存在的话)。您可以对任何方法进行注解,无论其可见性如何。spring-doc.cadn.net.cn

通过使用 AnnotationTransactionAspect 将您的应用程序编织在一起,您必须使用 AspectJ 构建您的应用程序(参见 AspectJ 开发指南)或使用加载时编织。有关使用 AspectJ 的加载时编织的讨论,请参见 Spring 框架中使用 AspectJ 的加载时编织spring-doc.cadn.net.cn