Spring的AspectJ模式缓存与AspectJ模式事务

时间:2014-06-16 18:50:01

标签: aspectj spring-aop spring-data-jpa spring-cache

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

  1. 交易管理
  2. 缓存
  3. 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模式事务支持不同?

1 个答案:

答案 0 :(得分:1)

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