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

> 原文： [https://howtodoinjava.com/spring-transaction/spring-transactions-on-non-public-methods-with-load-time-weaving/](https://howtodoinjava.com/spring-transaction/spring-transactions-on-non-public-methods-with-load-time-weaving/)

在本教程中，我们将学习如何在非公开方法上的任何 Spring 应用程序中应用事务（通过默认 [**spring AOP**](https://howtodoinjava.com/spring/spring-aop/top-spring-aop-interview-questions-with-answers/) 只能对 [IoC 容器](https://howtodoinjava.com/spring/spring-core/different-spring-3-ioc-containers-with-example/)中的 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`注解（应仅在类上使用）。

配置示例如下所示：

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

```

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

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

```java
<beans>

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

    <!-- Other beans declarations-->

</beans>

```

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

```java
<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](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw)