My Spring应用程序依赖于我需要覆盖类的库,比如说com.dep.A
。我想创建扩展B
的类A
,并告诉spring每次A
尝试加载(通过任何代码或依赖项)我想加载B
代替。
是否有弹簧设置可实现此目的?如果没有,AspectJ会是一个选项(我认为Spring有一个AspectJ功能)?
编辑:对用例更具体一些 如果我只能将自己插入到类A
的特定方法的执行流程中,我会非常高兴。实际上,忘记B
扩展A
:我真正想要实现的是拦截方法A.originalMethod(MyObject o)
的执行,并在我的自定义方法o
中使用B.interceptOriginalMethod()
1}}。
答案 0 :(得分:2)
由于该类来自不同的库,它听起来不像是一个spring bean,然后Spring无法帮助你。它基本上归结为如何构造对象,如果你没有调用 new 运算符,但是库中的代码只有两个选项(除非Jar已经签名,那么我认为有没有选择)。
我曾经多次使用选项2修复不同开源库中的小问题,当时我懒得从源代码重建整个库。升级库时必须小心,以防它们更改底层代码。
答案 1 :(得分:0)
使用@Autowired
和@Qualifier
按名称而不是类型加载bean。以下是示例
@Autowired
@Qualifier("b")
private A a;
上面的代码将加载B类的引用,前提是B也是一个spring bean。
答案 2 :(得分:0)
虽然@Klaus Groenbaek的回答是正确的(我会将其标记为),但我已经使用其他方法解决了我的问题。
我很幸运,com.dep.A
用Spring @ConditionalOnMissingBean
注释。
因此,只需创建扩展B
的bean A
并在主应用程序类中声明:
@Bean
public A a(){
return new A();
}
Spring会加载你的类而不是原来的类。