我正在处理一种设计情况,我不确定如何解决它,或者我的微设计是否有任何问题。
public abstract class A implements SomeFrameworkInterface {
private final Param1 a1;
@Inject
private Param2 a2;
protected A(Param1 a1) {
this.a1 = a1;
}
@Override
public someFrameworkInterfaceMethod() {
//code
doMyStuff();
}
protected abstract void doMyStuff();
}
@Named
@SomeCustomAnnotation(property="someProperty")
public class B extends A {
@Inject
public B(Param1 b1) { //b1 is different for every implementation of class A, through some annotations
super(b1);
}
@Override
protected void doMyStuff() {
//code
}
}
- 我需要将 A 类中的“@Inject Param2 a2”更改为通过构造函数注入,因此代码是可测试的,并且我将清除与此相关的代码异味。
- 我不想从 B 构造函数发送它,因为我必须在 B 构造函数、A 构造函数和 A 的所有实现中的每个构造函数中再添加一个参数...但是子类永远不需要知道 Param2实例。
- Param2 可能是静态的,但需要注入,因为它是组件(@Named),所以我没有找到静态注入的方法。
限制如下:
- 具有要使用的自定义注释和要实现的接口的第 3 方框架
- 代码必须是可测试的,因此不允许在字段上使用 @Inject/@Autowired
- 我们被限制使用在提到的自定义框架中“封装”的 Spring,因此我们只能使用纯 Java (JSR-330)。(如果 Spring 中有任何解决方案,也很高兴知道它)