gpt4 book ai didi

java - 您如何使 AspectJ 能够在由同一类的方法调用的连接点上执行通知?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:39 26 4
gpt4 key购买 nike

我正在实现一个类似于 Spring Cache 的基于 AOP 的缓存层,当连接点被其自身类中的另一个方法调用时,我无法获得执行建议。我最初使用的是 Spring AOP 的 AspectJAutoProxy,我明白为什么这不允许这个用例,所以我尝试切换到 AspectJ 的加载时编织器,但它似乎没有做任何事情。以下是所有详细信息:

Spring 版本:4.5.2

AspectJ 版本:1.8.9

添加了 Java 代理以运行命令。请注意,我已尝试将这两个代理中的每一个单独和一起包括在内,但在行为上没有任何差异:

-javaagent:/var/app/cops/jars/aspectjweaver-1.8.9.jar -javaagent:/var/app/cops/jars/spring-instrument-4.3.0.RELEASE.jar

应用入口点:

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
public class Application implements ApplicationContextAware {
@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() throws Throwable {
InstrumentationLoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver();
return loadTimeWeaver;
}

// Other unrelated beans
}

建议签名:

@Around("@annotation(cacheable)")
public Object processCacheable(ProceedingJoinPoint joinPoint, Cacheable cacheable) throws Throwable

方法签名:

@Cacheable(key = "'test-key'")
public Map<String, Object> getDataFromSource()

“processCacheable”在“getDataFromSource”被另一个类调用之前执行,但如果从同一个类中调用仍然不会。为了让 LTW 正常工作,我是否缺少某些配置?

最佳答案

我通常的免责声明:我不是 Spring 用户。所以我对 Spring 配置的经验几乎为零。但是在查看了您放在命令行上的编织代理后,我在那里找不到任何与 AspectJ 相关的东西。这是一个非常小的 JAR,只有检测类,这些检测类似乎依赖于在您的容器中部署和以某种方式配置的其他转换器/编织器。

我建议你把实际的 AspectJ weaving agent在你的命令行上,看看会发生什么。 ;-)

更新: 或者,如果这没有帮助,您可以同时在命令行上尝试两个代理。我无法确切地告诉您 spring-instrument 做了什么,但我认为它以某种方式将 aspectjweaver(它执行实际的方面编织)更深入地集成到 Spring 框架中,即使 AspectJ 会即使不知道 Spring 的存在,也可以在没有 Spring 的情况下工作。

关于java - 您如何使 AspectJ 能够在由同一类的方法调用的连接点上执行通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com