gpt4 book ai didi

java - 强制 Spring 在运行时使用特定的类代替另一个类

转载 作者:行者123 更新时间:2023-11-30 02:41:30 25 4
gpt4 key购买 nike

我的 Spring 应用程序依赖于一个我需要重写类的库,例如 com.dep.A。我想创建扩展A的类B,并告诉spring每次A尝试加载(通过任何代码或依赖项)我想改为加载 B

是否有 Spring 设置可以实现这一目标?如果没有,AspectJ 是否是一个选项(我认为 Spring 有 AspectJ 功能)?

编辑:关于用例更具体一些如果我只能将自己插入到类 A 的特定方法的执行流程中,我会很高兴。事实上,忘记 B 扩展 A:我真正想要实现的是拦截方法 A.originalMethod(MyObject o) 的执行>,并在我的自定义方法 B.interceptOriginalMethod() 中使用 o

最佳答案

由于该类来自不同的库,因此听起来不像是 Spring bean,那么 Spring 无法帮助您。它基本上取决于对象的构造方式,如果您没有调用 new 运算符,但是库内的代码您只有两个选择(除非 Jar 已签名,那么我认为有无选项)。

  1. 加载时间编织。它允许您插入切点并替换方法的代码。这需要使用 java 代理启动 JVM,并且应该是最后的手段。
  2. 如果您有源代码,则可以使用类阴影。您只需将类源代码复制到源代码树中(相同的包名称)。这是有效的,因为 /classes 几乎总是在类路径中的库之前,因此当类加载器尝试加载该类时,它会找到您的修改版本,从而隐藏原始版本。

当我懒得从源代码重建整个库时,我曾多次使用选项 2 来修复不同开源库中的小问题。升级库时必须小心,以防他们更改了底层代码。

关于java - 强制 Spring 在运行时使用特定的类代替另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41544439/

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