在本教程中,我们将学习如何在非公开方法上的任何 Spring 应用程序中应用事务(通过默认 spring AOP 只能对 IoC 容器中的 bean 的公共方法配置建议)。 使用此技术,您可以管理非公共方法的事务,也可以管理在 Spring IoC 容器外部创建的对象(即不受 IoC 容器管理)中的任何方法上的事务。
使用AnnotationTransactionAspect
管理事务
Spring 具有一个名为AnnotationTransactionAspect
的 AspectJ 切面,它可以管理任何对象的任何方法的事务,即使这些方法是非公开的或对象是在 Spring IoC 容器外部创建的也是如此。
该切面将管理带有@Transactional
注解的任何方法的事务。 要启用此有用的切面,您可以通过以下两种方式之一来更改配置:
@EnableLoadTimeWeaving
注解<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