使用 @Transactional
与 AspectJ
@Transactional
with AspectJ
你也可以通过使用 AspectJ 切面在 Spring 容器之外使用 Spring 框架的 @Transactional
支持。为此,首先使用 @Transactional
注解标注你的类(以及可选的类方法),然后将你的应用程序与 spring-aspects.jar
文件中定义的 org.springframework.transaction.aspectj.AnnotationTransactionAspect
进行链接(织入)。你还必须使用事务管理器配置切面。你可以使用 Spring 框架的 IoC 容器来处理切面的依赖注入。配置事务管理切面的最简单方法是使用 <tx:annotation-driven/>
元素,并将 mode
属性指定为 aspectj
,如 使用 @Transactional 中所述。由于我们在这里关注的是在 Spring 容器之外运行的应用程序,因此我们将向你展示如何以编程方式实现这一点。
在继续之前,你可能需要分别阅读 使用 @Transactional 和 AOP。
以下示例展示了如何创建一个事务管理器并配置 AnnotationTransactionAspect
来使用它:
- Java
- Kotlin
// 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
注解为该类中任何公共方法的执行指定了默认的事务语义。
类中方法上的 @Transactional
注解会覆盖类注解提供的事务语义(如果存在)。你可以注解任何方法,无论其可见性如何。
要将你的应用程序与 AnnotationTransactionAspect
编织在一起,你必须使用 AspectJ 构建你的应用程序(参见 AspectJ 开发指南)或使用加载时编织。关于使用 AspectJ 进行加载时编织的讨论,请参阅 Spring Framework 中使用 AspectJ 的加载时编织。