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

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

我的问题与 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 模式事务支持不同?

最佳答案

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

关于aspectj - Spring 的 AspectJ 模式缓存与 AspectJ 模式事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24250220/

相关文章:

java - 包内所有方法的@AspectJ 切入点

java - Maven 不编织 aspectj 代码

logging - AspectJ 切入点 - 获取对连接点类和名称的引用

java - 使对象 Spring 管理

java - Spring aop事务不提交事务

java - Spring aop : Pointcut defined for subclasses but only one subclass is invoked

spring - 如何订购@Aspect

java - Spring boot 无法运行,但服务 UTest 运行良好

java - Spring Data JPA 删除不是我所期望的

spring-boot - Elasticsearch Spring boot findAll Result窗口太大,from + size必须小于或等于:[10000]但为[331576]