我一直在使用手动依赖注入一段时间,我开始从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;
}
}
答案 0 :(得分:2)
如果(正如您在评论中所说)aContextualValue
来自用户,则无法真正注入它。因此,您无法完全让DI容器管理MyClass
。
你可以做的是实现MyClassFactory
之类的东西,它会为你产生MyClass
。
类似的东西:
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);
}
}