在AspectJ中使用@Transactional

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

在继续之前,您可能希望阅读使用@TransactionalAOP

以下示例展示了如何创建事务管理器并配置AnnotationTransactionAspect以使用它:

  • Java

  • Kotlin

// 构建适当的事务管理器
DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());

// 配置AnnotationTransactionAspect以使用它;这必须在执行任何事务方法之前完成
AnnotationTransactionAspect.aspectOf().setTransactionManager(txManager);
// 构建适当的事务管理器
val txManager = DataSourceTransactionManager(getDataSource())

// 配置AnnotationTransactionAspect以使用它;这必须在执行任何事务方法之前完成
AnnotationTransactionAspect.aspectOf().transactionManager = txManager
当您使用此切面时,必须为实现类(或类中的方法或两者)添加注解,而不是接口(如果有)实现的注解。AspectJ遵循Java的规则,即接口上的注解不会被继承。

类上的@Transactional注解指定了类中任何公共方法执行的默认事务语义。

类内方法上的@Transactional注解会覆盖类注解给出的默认事务语义(如果存在)。您可以为任何方法添加注解,无论其可见性如何。

要将您的应用程序与AnnotationTransactionAspect编织在一起,您必须使用AspectJ构建您的应用程序(请参阅AspectJ开发指南)或使用加载时编织。有关使用AspectJ进行加载时编织的讨论,请参阅Spring Framework中使用AspectJ进行加载时编织