【问题标题】:How to write AOP @Around for a package from specific dependency如何为来自特定依赖项的包编写 AOP @Around
【发布时间】:2021-07-30 13:15:18
【问题描述】:

我在不同的外部库/依赖项中有多个同名的包,例如 org.abc.com.client.*,它们具有相同的 groupId 名称但唯一的 artifactId 名称。

因此,它看起来像:

<dependency>  
  <groupId>same_name</groupId>  
  <artifactId>unique</artifactId>  
  <version>same_or_different</version>   
</dependency>  

且唯一的 artifactId 具有相同的包名称。我的课程不需要 AOP。

我想为特定artifactId 的包写@Around

@Around("call(* package(org.abc.com.client)_of_specific_artifactId1(..))")
public void doSomething(){}

@Around("call(* package(org.abc.com.client)_of_specific_artifactId2(..))")
public void logSomething(){}

【问题讨论】:

  • artifcatId 唯一区分这些类的因素吗?使用 Spring AOP,这似乎是不可能的。
  • 是的,我认为artifactId 仅作为包装的区别因素。
  • 我将不胜感激。问一个问题然后不对答案做出反应是不礼貌的。如果我能够回答您的问题,也请接受并投票。
  • @kriegaex 我知道您的回答,但是,我必须对其进行测试。我不只是在努力解决这个问题。我也在其他问题上工作。我必须在 kotlin 项目中实现它。请保持耐心。谢谢。

标签: spring aop spring-aop


【解决方案1】:

工件 ID 是一段构建时信息,在运行时应该完全不相关。顺便说一句,工件 ID 可以更改,依赖项通过 Maven Shade 或 Maven Assembly 插件等重新打包到 uber JAR 中。您想要做的只是糟糕的设计。您应该重构您的库或找到另一种方法来区分它们。

FWIW,您也可以在构建期间解决您的问题,方法是使用 binary weavingnative AspectJ 方面应用于选定的工件,创建可以替换原始工件的新编织工件. AspectJ Maven 插件does that for you,如果配置正确的话。对于 Gradle,请查看 Freefair。


更新: 大约 7 年前,我 answered another question 涉及输入 JAR 的二进制编织。这是一个更复杂的多模块场景,如果您阅读了整个答案,您还将找到一个指向 GitHub 存储库的链接,其中包含完整的 MCVE。只需将 Maven 插件 org.codehaus.mojo:aspectj-maven-plugin:1.7 替换为 dev.aspectj:aspectj-maven-plugin:1.13,因为 MojoHaus 版本仅支持 Java 8,并且与 Aspectj.dev version 相比缺少一些功能。

【讨论】:

  • 注意:“你想要做的只是糟糕的设计”,这些首先不是我的库,我无法对库进行更改。我在启动项目中使用最新版本的 kotlin 和 spring boot。我不确定它是否对我有用,但感谢您的回复。我会试一试的。
  • Aso,在这个 (github.com/spring-projects/spring-framework/issues/22462) 得到修复之前,可能不值得将 AOP 集成到 kotlin spring-boot 项目中。
  • 您在混淆主题。我说的是原生的 AspectJ,Spring issue 是关于 Spring AOP 的,所以 AspectJ 不受它的影响。此外,您的示例代码使用了 Spring AOP 中不可用的 call 切入点。因此,我假设您无论如何都想使用 AspectJ 并且知道其中的区别。
  • 我使用 io.freefair.aspectj.post-compile-weaving version 6.0.0-m2 作为 gradle 插件,implementation 'org.aspectj:aspectjrt:1.9.6implementation 'org.aspectj:aspectjweaver:1.9.6 作为依赖项。不知何故,我必须解决这个问题。我想我可以从你的回答中提取一些知识。在这里,call 切入点起作用了。
  • 如果您只是在提出实际问题一周后发布MCVE(最好是在 GitHub 上)而不是零碎的代码 sn-ps 和 cmets 中的信息,我可以为您提供更好的帮助。就像我说的,如果call 为您工作,那么您正在使用 AspectJ,而您正在等待的 Spring 问题是关于 Spring AOP,而不是关于 AspectJ。你能调试你看不到的东西吗?我不能。如果您想要更具体的答案,请给我看一些东西。但是我写的是正确的解决方案,如果从 Maven 到 Gradle 就适应了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2011-03-03
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2015-12-17
  • 2016-10-21
相关资源
最近更新 更多