0
public class Widget {
    @Inject
    Fizz fizz;

    public Widget(Fizz fizz) {
        super();

        setFizz(fizz);
    }

    public void setFizz(Fizz fizz) {
        this.fizz = fizz;
    }
}

这是 Guice 反模式吗?!?!

如果我说“fizz将被注入(通过@Inject)”,但是我允许构造函数和设置器接受嘶嘶声,这是不必要的冗余吗?会不会和Guice的喷油器发生冲突?

我想我很困惑:

  • 当你应该用@Inject, vs注释属性时
  • 当您应该通过构造函数/getter 自己“注入”属性时

有什么想法吗?提前致谢!

4

3 回答 3

4

为什么不使用这样的东西(即使用构造函数注入)?

public class Widget {
    private Fizz fizz;

    @Inject
    public Widget(Fizz fizz) {
        super();

        this.fizz = fizz;
    }

}

另请参阅http://code.google.com/p/google-guice/wiki/Injections

于 2012-04-07T18:42:40.533 回答
3

您应该对REQUIRED的依赖项使用构造函数注入。当依赖项是OPTIONAL时使用属性注入

于 2012-04-08T16:37:15.857 回答
1

我肯定会说这是一个问题,不是因为 Guice 做不到,而是因为您的代码有错误。Guice 将尝试调用默认的无参数构造函数(它不存在)并失败。

但即使您添加了无参数构造函数,这仍然是一种反模式。我使用 DI 框架已经有一段时间了,从来没有遇到过需要进行字段注入的情况。我确信它有一个用例,否则 Guice 的人不会包含它,但是如果没有特殊代码(字节码操作或反射),它会使您的代码无法测试。

由于多种原因,构造函数注入通常是最好的。它使任何调用者都清楚您的依赖项是什么,它允许您同时初始化所有类的不变量(避免部分初始化的类),并且它是唯一允许您创建不可变对象的 DI 风格,它们是线程安全并降低程序复杂性。

我唯一的方法注入用例是当我不想要求子类来声明父类的依赖项时,或者当我想要一个“可选”依赖项时,但这些很少见。

于 2012-04-08T14:36:21.113 回答