我知道应该尽可能使用构造函数注入,但是出于理论上的理解,我想了解有关字段和方法注入的更多信息。
方法注入显然是非常罕见的,根据Jake Wharton的说法,唯一的用例是必须将依赖对象的实例传递给依赖项(因为它可能尚未在构造函数中完全实例化) )。
方法注入示例:
@Inject
public void enableStreaming(Streaming streaming) {
streaming.register(this);
}
字段和方法向依赖对象的注入过程可以通过两种方式触发:
inject
)。这就是示例中发生的情况
上面(我省略了构造函数,想象它被@Inject
注释了)component.inject(object)
,最常用于
现场注入活动和碎片。我要的是相反情况的示例。
inject
调用)?对于这两种情况,我都想知道
component.inject()
方法是从对象的外部或内部调用的,其用例是什么。有没有过
我们称之为的情况
ExampleObject exampleObject = new ExampleObject();
component.inject(exampleObject);
要在exampleObject上执行字段或方法注入?
答案 0 :(得分:1)
我没有方便的发布或官方示例,但是您描述的所有情况都可以正常工作。字段注入与构造函数注入结合使用是不常见的,因为字段必须非final
才能与字段注入一起使用,如果通过构造函数传递,则字段可能是最终字段。对于类似于您上面编写的enableStreaming
方法的自注册案例,很少看到没有构造函数注入的方法注入,但这仍然是一个不寻常的用例。
尽管字段和方法注入可能在被注入的方法或类内进行,但这将有必要为您的类MembersInjector<T>
接收特定的Component实例或T
,这至少同样麻烦在上面的第三个示例中以component.inject(exampleObject)
的身份调用。毕竟,依赖项注入的全部要点是允许调用者控制类的依赖项,因此,可以认为拥有类控制是否以及如何提供其依赖项是DI的弱项。
我唯一能想到的一个类将在哪里管理类的情况是,如果您的类想有条件地自我注入(if (BuildOptions.FEATURE_X_ENABLED) { injector.inject(this); }
),但想到的其他许多模式会更好地处理这种情况。