我已经使用了一段时间的手动依赖注入,我开始研究来自javax (JSR330)的@Inject注释。
我有过这样的事情:
public class MyClass {
public MyClass(DepA depA, DepB depB) {
this.depA = depA;
this.depB = depB;
}
}为了使用它,我实例化它如下:
public void myMethod() {
DepA depA = new DepA();
DepB depB = new DepB();
MyClass myClass = new MyClass(depA, depB);
}但是,当我的依赖项有依赖项时,它就会变得很混乱,所以我读了一些,并使用了这一点(似乎每个人都同意,可注入的构造函数是最佳实践):
public class MyClass {
public MyClass() {}
@Inject
public MyClass(DepA depA, DepB depB) {
this.depA = depA;
this.depB = depB;
}
}然后像这样使用它:
public void myMethod() {
MyClass myClass = new MyClass();
}这看起来像一种魅力,但是缺少一个用例,我找不到答案:如果我想在构造函数中注入依赖项和使用一个真正的参数怎么办?
例如,这样的事情是否有可能:
public class MyClass {
public MyClass(String aContextualValue) {}
@Inject
public MyClass(DepA depA, DepB depB, String aContextualValue) {
this.depA = depA;
this.depB = depB;
this.aContextualValue = this.aContextualValue;
}
}发布于 2018-04-22 20:01:08
如果(如您在注释中所述) aContextualValue来自用户,则不能真正注入它。因此,您不能完全让DI容器管理MyClass。
相反,您可以实现类似于MyClassFactory的东西,这将为您生成MyClasses。
类似于:
public class MyClassFactory {
private final DepA depA;
private final DepB depB;
public MyClassFactory(DepA depA, DepB depB) {
this.depA = depA;
this.depB = depB;
}
public MyClass createMyClass(String aContextualValue) {
return new MyClass(this.depA, this.depB, aContextualValue);
}
}https://stackoverflow.com/questions/49967074
复制相似问题