当有两个不同的构造函数时如何注入Guice?

时间:2009-12-03 15:29:33

标签: dependency-injection guice

Total Guice noob在这里,看了几篇文章并看了介绍视频,就是这个。

这是我正在尝试“guicifiy”的简化旧代码。无法弄清楚如何,因为(据我所知),我只能@inject - 注释两个构造函数中的一个?调用类如何创建一个或另一个实例?或者我必须以某种方式重构这个?

public class MyDialog extends JDialog {
    public MyDialog( JFrame parent, <other parameters...> ) {
        super( parent );
    }

    public MyDialog( JDialog parent, <other parameters...>) {
        super( parent );
    }
 }

3 个答案:

答案 0 :(得分:4)

你只能注入一个人。

根据此课程的使用方式,您可以:

  • 使用两个“新”方法将工厂注入客户端代码。
  • 将所有参数转换为一个ctor,并在不需要时传递null。
  

调用类如何创建一个或另一个实例?

这表明调用类需要多个MyDialog实例?然后你需要使用一个手工工厂(如果你只有一个ctor,Assisted Inject可以为你处理)。我不知道你要做什么的细节,我可能会重复你已经知道的但是作为一个空白的陈述我建议从MyDialog中提取一个界面并让工厂归还它们。这样你就可以在测试中伪造MyDialog。

答案 1 :(得分:1)

构造函数注入非常干净。 mlk是对的,说你只能注入一个构造函数。

你可以做的是使用方法注入:

public class Smt {

    private int a;
    private Cereal cereal;
    private Personality personality;
    private ignition;

    public Smt() {
        this.a = 5;
    }

    public Smt(int a) {
        this.a = a;
    }

    @Inject
    public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality,
        Ignition ignition) {
        this.cereal = cereal;
        this.personality = personality;
        this.ignition = ignition;
    }
}

Guice会做的是打电话给你的班级'setup班级方法并提供所有注射。然后你在构造函数中执行相同的操作 - 将对象分配给类的属性。

答案 2 :(得分:0)

我同意之前的评论。 只是一个额外的提示:构造函数注入应该提供类所需的所有依赖项。正如mlk所说,一种方法可能是用大多数参数来注释构造函数,然后通过在需要的地方传递空值来重构另一个来调用前者。 此外,Guice 3.0支持所谓的构造函数绑定,它允许程序员指定要使用的构造函数。有关详细信息,请参阅here