我使用GUICE作为依赖注入容器。如果我可以选择构造函数注入或Field注入,我相信我应该总是更喜欢构造函数注入而不是场注入。我的理解是否正确?
是否有任何有效的用例,其中Field注入比Constructor注入更有意义?
答案 0 :(得分:1)
是的,你是对的。尽可能避免进行现场注射。
我认为最重要的是,当您使用构造函数注入时,您可以绝对确定您的对象永远不会处于不一致状态,因为您无法在不首先创建其依赖项的情况下创建此类对象。此外,在构造函数中声明的依赖项为您的类提供了明确的合同 - 您可以轻松地查看该类所依赖的内容。现场注射并非总是如此。
此外,您可以在没有DI框架的情况下使用此类对象,例如,在单元测试中。相反,在现场注入的情况下(特别是在字段为私有时),您不能在没有过多麻烦的情况下在DI容器之外使用您的类。如果您使用字段注入并希望可移植性,那么您的字段也不能是final
,这很糟糕,因为您应该尝试使对象尽可能不可变。
几乎不需要进行现场注射。它们只适用于可选的依赖项(甚至对于这些我建议使用方法注入)或者特殊的“方面”类依赖项,例如记录器。
另一个极具争议的用例是当你需要创建一个具有多个超类的类时,每个类都有依赖项。使用构造函数注入,您必须通过所有构造函数将所有超类的所有依赖项传递到顶部。这可能是不方便的,并且现场注入解决了这个问题。但这是一个非常罕见的用例(我只在我的练习中遇到过一次),我个人认为通过多个构造函数传递依赖关系并不是那么糟糕。