Java 依赖项注入的正确结构(使用Guice)

Java 依赖项注入的正确结构(使用Guice),java,dependency-injection,guice,guice-3,Java,Dependency Injection,Guice,Guice 3,我希望得到一些建议和反馈,以了解对于具有以下所述结构的系统,构造依赖项注入的最佳方法。我使用的是Guice,因此我更喜欢以其基于注释的声明为中心的解决方案,而不是XML密集的Spring样式的配置 考虑一组类似的对象,Ball、Box和Tube,每个对象都依赖于通过构造函数提供的记录器。(这可能并不重要,但所有四个类恰好都是应用程序的单例,而不是四人帮) 一个ToyChest类负责创建和管理三个形状对象ToyChest本身不依赖于Logger,只依赖于创建图形对象 toycest类被实例化为Ma

我希望得到一些建议和反馈,以了解对于具有以下所述结构的系统,构造依赖项注入的最佳方法。我使用的是Guice,因此我更喜欢以其基于注释的声明为中心的解决方案,而不是XML密集的Spring样式的配置

考虑一组类似的对象,
Ball、Box和Tube
,每个对象都依赖于通过构造函数提供的
记录器。(这可能并不重要,但所有四个类恰好都是应用程序的单例,而不是四人帮)

一个
ToyChest
类负责创建和管理三个形状对象
ToyChest
本身不依赖于
Logger
,只依赖于创建图形对象

toycest
类被实例化为
Main
类中的应用程序单例

我对在
ToyChest
中构造形状的最佳方法感到困惑。我要么(1)需要访问已经连接到
模块的Guice
注入器
实例,要么(2)需要创建一个新的
注入器
连接到右侧
模块

(1) 通过将
@Injector
字段添加到
ToyChest
来完成,但这感觉很奇怪,因为
ToyChest
实际上没有任何直接依赖项,只有它实例化的子项

对于(2),我不确定如何传入相应的
模块

我走对了吗?有没有更好的方法来组织这个

这个问题的答案提到了使用
提供者,而不是直接使用注射器,但我不确定这应该如何工作

编辑:


也许一个更简单的问题是:当使用Guice时,哪里是构造shapes对象的合适位置
ToyChest
将对它们进行一些配置,但我认为它们可以在其他地方构建
ToyChest
(作为管理它们的容器),而不是
Main
,在我看来,似乎是构建它们的合适位置。

一个合适的方法是让guice构建依赖项。这就是创建和配置

在您的情况下,您应该在
中构造一个喷油器。从喷油器中可获得
ToyChest
。当您通过注射器获得
ToyChest
时,它由guice管理,您可以依靠它提供正确配置的所有依赖项

在您的情况下,您可以在
toycest
中插入
Provider
Provider
等,并在需要时从提供程序中检索实例
ToyChest
不负责构造实例,只负责使用它。您还可以检查是否有插件体系结构

到目前为止,一切都是由guice管理的,因此形状可以在使用类不知道的情况下注入其记录器

如果要将某些运行时参数传递给新创建的形状实例,则可以使用


提示:您不需要使用构造函数注入,您可以在字段或setter上进行注入,这简化了构造函数。

Ball、Box和Tube都是应用程序单例,但它们是由ToyChest创建的?你能澄清为什么需要这样做吗?它们是否可以在ToyChest构建时交给它?1)ToyChest决定创建哪些。2) 它们可以通过构造函数传递给toycest,但其他地方不需要它们。因此(在我看来)这将不必要地使构造函数复杂化。还有一个海龟的问题。是什么让它们传递给ToyChest的?也许通过构造函数传递它们是正确的方法,我只是看不到更大的结构。谢谢,这支持了我在提出问题后提出的结论,并提出了一些其他的选择。ToyChest需要具备DI意识,可以通过构造函数/设置器接受形状,也可以通过接受工厂/提供者/映射绑定器来获取形状。我想我的障碍在于我的控制权被颠倒了!