如何将参数传递给Java中的可注入构造函数?

时间:2018-04-22 14:34:07

标签: java dependency-injection

我一直在使用手动依赖注入一段时间,我开始从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;
    }
}

1 个答案:

答案 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);
    }
}