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

    :::info 在继续之前,你可能需要分别阅读《使用 使用 @TransactionalAOP》。 :::

    下面的例子显示了如何创建一个事务管理器并配置 AnnotationTransactionAspect 来使用它:

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

    :::info 当你使用这个 aspect 时,你必须注解实现类(或该类中的方法或两者),而不是该类实现的接口(如果有)。AspectJ 遵循 Java 的规则,即接口上的注解不被继承。 :::

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

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

    要用 AnnotationTransactionAspect 编织你的应用程序,你必须用 AspectJ 构建你的应用程序(见 AspectJ 开发指南)或使用加载时编织。请参阅 Spring 框架中使用 AspectJ 的加载时间编织,了解使用 AspectJ 的加载时间编织的讨论