使用 @Transactional 与 AspectJ

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

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

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

  • Java

// 构造一个合适的事务管理器
DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());

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

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

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

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