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