在AspectJ中使用@Transactional
@Transactional with AspectJ
你也可以通过AspectJ方面在Spring容器之外使用Spring Framework的@Transactional支持。为此,首先用@Transactional注解标注你的类(以及可选的类方法),然后将你的应用程序与spring-aspects.jar文件中定义的org.springframework.transaction.aspectj.AnnotationTransactionAspect关联起来。你还必须配置这个方面以使用事务管理器。你可以使用Spring Framework的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
当你使用此方面(aspect)时,必须对实现类(或该类中的方法)进行注释,而不是对类所实现的接口(如果有的话)进行注释。AspectJ遵循Java的规则,即接口上的注解不会被继承。
类上的@Transactional注解指定了该类中任何公共方法执行时的默认事务语义。
类中的方法上使用的@Transactional注解会覆盖该类注解(如果存在)所规定的默认事务语义。你可以对任何方法添加此注解,而不受方法可见性的限制。
要将你的应用程序与AnnotationTransactionAspect集成,你必须使用AspectJ来构建应用程序(请参阅AspectJ开发指南),或者使用加载时织入(load-time weaving)技术。关于如何使用AspectJ进行加载时织入,请参阅在Spring框架中使用AspectJ的加载时织入。