6

我的问题与 Spring 的 AspectJ 模式有关,尤其是如何启用它:

  1. 事务管理
  2. 缓存

1) 我注意到为了启用 AspectJ 模式进行事务管理,我只需要执行以下操作:

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)

2) 而为了使用 AspectJ 模式进行缓存,似乎必须:

- 将以下 jar 放入 Tomcat 的 lib 目录: -org.springframework:spring-instrument-tomcat 在 Tomcat 的 server.xml 中添加以下行:

<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>

- 添加以下配置:

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class LoadTimeWeavingConfiguration implements LoadTimeWeavingConfigurer {
    @Override
    public LoadTimeWeaver getLoadTimeWeaver() {
        return new ReflectiveLoadTimeWeaver();
    }
}

- 最终能够使用 AspectJ 模式,如下所示:

@Configuration
@EnableCaching(mode = AdviceMode.ASPECTJ)

以上是对的吗?如果是这样,为什么 AspectJ 模式缓存与 AspectJ 模式事务支持不同?

4

1 回答 1

2

您为该@EnableCaching案例列出的额外配置并不比@EnableTransactionManagement. 如果您选择mode = AdviceMode.ASPECTJ它只是意味着它将使用 AspectJ 而不是 CGLIB 代理来进行事务管理/缓存功能。如果您启用了spring-aspects-<version>.jar作为方面库列出的编译时编织,它应该可以开箱即用(假设所有其他必需的事务管理/缓存配置相关的 bean 在应用程序上下文中都可用)。如果您不使用编译时编织,而是选择使用加载时编织,-javaagent:/path/to/aspectjweaver-<version>.jar那么在命令行中作为 JVM 参数就足够了。ReflectiveLoadTimeWeaver和_TomcatInstrumentableClassLoader仅在您的构建中未使用编译时编织且 VM 中不存在加载时编织代理且您仍希望通过类加载进行加载时编织时才需要。

于 2016-12-28T22:17:11.150 回答