带有加载时织入的非公开方法上的 Spring 事务

带有加载时织入的非公开方法上的 Spring 事务

原文: https://howtodoinjava.com/spring-transaction/spring-transactions-on-non-public-methods-with-load-time-weaving/

在本教程中,我们将学习如何在非公开方法上的任何 Spring 应用程序中应用事务(通过默认 spring AOP 只能对 IoC 容器中的 bean 的公共方法配置建议)。 使用此技术,您可以管理非公共方法的事务,也可以管理在 Spring IoC 容器外部创建的对象(即不受 IoC 容器管理)中的任何方法上的事务。

使用AnnotationTransactionAspect管理事务

Spring 具有一个名为AnnotationTransactionAspect的 AspectJ 切面,它可以管理任何对象的任何方法的事务,即使这些方法是非公开的或对象是在 Spring IoC 容器外部创建的也是如此。

该切面将管理带有@Transactional注解的任何方法的事务。 要启用此有用的切面,您可以通过以下两种方式之一来更改配置:

  1. @EnableLoadTimeWeaving注解
  2. <context:load-time-weaver />; 组态

使用@EnableLoadTimeWeaving注解

必须在配置类上使用@EnableLoadTimeWeaving注解以在加载时获取。 您需要做的就是定义@EnableTransactionManagement注解并将其mode属性设置为Aspectj

切面说,容器应使用加载时或编译时织入来启用事务通知。 另一个值代理表示容器应使用默认的 Spring AOP 机制。

请务必注意,aspect 模式不支持在接口上配置@Transactional注解(应仅在类上使用)。

配置示例如下所示:

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving
public class MyApplicationConfiguration 
{ 
	//Configuration code
}

使用<context:load-time-weaver/>配置

如果您在应用程序中使用了基于 XML 的配置,则可以使用以下配置更改来启用此功能。

<beans>

    <context:load-time-weaver />
    <tx:annotation-driven mode="aspectj"/>  

    <!-- Other beans declarations-->

</beans>

要启用加载时织入,还必须包括spring-instrument模块。 如果您使用的是 Maven,请将以下依赖项添加到您的项目中。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
</dependency>

  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-instrument</artifactId>
  <version>${spring.version}</version>
</dependency>

在下面将您的问题和评论丢给我。

祝您学习愉快!

参考http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw