在本教程中,我们将学习如何在非公开方法上的任何 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)@EnableLoadTimeWeavingpublic 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
