Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是Guice反模式吗?_Java_Dependency Injection_Guice - Fatal编程技术网

Java 这是Guice反模式吗?

Java 这是Guice反模式吗?,java,dependency-injection,guice,Java,Dependency Injection,Guice,这是Guice反模式吗 如果我说fizz将通过@Inject注入,但我允许构造函数和setter接受fizz,这是不必要的冗余吗?会不会与Guice的注射器发生冲突 我想我很困惑: 当您应该用@Inject注释属性时,vs。 当您应该通过构造函数/getter自己注入属性时 有什么想法吗?提前谢谢 为什么不使用类似的东西,即使用构造函数注入 public class Widget { @Inject Fizz fizz; public Widget(Fizz fizz)

这是Guice反模式吗

如果我说fizz将通过@Inject注入,但我允许构造函数和setter接受fizz,这是不必要的冗余吗?会不会与Guice的注射器发生冲突

我想我很困惑:

当您应该用@Inject注释属性时,vs。 当您应该通过构造函数/getter自己注入属性时
有什么想法吗?提前谢谢

为什么不使用类似的东西,即使用构造函数注入

public class Widget {
    @Inject
    Fizz fizz;

    public Widget(Fizz fizz) {
        super();

        setFizz(fizz);
    }

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

另请参见

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

但即使添加了no-arg构造函数,这仍然是一种反模式。我使用DI框架已经有一段时间了,从来没有遇到过需要进行现场注入的情况。我确信它有一个用例,否则Guice的人就不会包括它,但是如果没有特殊的代码,不管是字节码操作还是反射,你的代码都不可能被测试

构造函数注入通常是最好的,原因有很多。它让任何调用方都清楚地知道您的依赖关系是什么,它允许您同时初始化所有类的不变量,避免部分初始化类,并且它是唯一允许您创建不可变对象的DI风格,这些对象是线程安全的,并且降低了程序复杂性

我唯一的方法注入用例是当我不需要一个子类来声明父类的依赖项时,或者当我需要一个可选的依赖项时,但这些情况很少出现。

对于需要的依赖项,应该使用构造函数注入。
当依赖项是可选的时,使用属性注入

不知道为什么会有冲突,我只是不知道,但似乎没有理由明确禁止在Guice之外设置自己的气泡,除非这是一个特定的目标。有什么区别?与构造函数相比,如果我注释属性,Guice的行为会有什么不同?当类需要几个依赖项时,注释构造函数一次就可以避免注释每个字段。不同的是这些变量可用的时间。如果你进行构造函数注入,显然你可以在构造函数中使用它们,如果使用getter/setter注入,则注入的成员仅在构造函数结束后才可用。在什么情况下,您会直接注释属性而不是构造函数?通常在没有构造函数的正常服务方法中,我使用属性注入,主要是因为更容易阅读
public class Widget {
    private Fizz fizz;

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

        this.fizz = fizz;
    }

}