Java 获取多个与Guice耦合为0的新实例

Java 获取多个与Guice耦合为0的新实例,java,dependency-injection,ioc-container,guice,Java,Dependency Injection,Ioc Container,Guice,我创建了一个类,它使用Java Executor API创建/管理具有固定线程数的池。 每个线程都需要一个特定对象的新实例,我想用Guice注入这个对象。 目前,我正在使用一个提供程序,它通过get()方法提供对象的新实例 但是现在这个类对提供者有一个依赖关系,它是特定于Guice的,有效地将代码耦合到Guice框架。 我真的希望这个类是真正的Guice不可知论者,这可能吗 仅仅创建使用“new”关键字的新实例不是一个选项,因为这使得不可能在单元测试中用模拟实现替换这些对象 依赖注入可能不适合这

我创建了一个类,它使用Java Executor API创建/管理具有固定线程数的池。 每个线程都需要一个特定对象的新实例,我想用Guice注入这个对象。 目前,我正在使用一个提供程序,它通过get()方法提供对象的新实例

但是现在这个类对提供者有一个依赖关系,它是特定于Guice的,有效地将代码耦合到Guice框架。 我真的希望这个类是真正的Guice不可知论者,这可能吗

仅仅创建使用“new”关键字的新实例不是一个选项,因为这使得不可能在单元测试中用模拟实现替换这些对象


依赖注入可能不适合这种情况,我最好创建一个工厂来获取这些对象?

如果您希望Guice为您注入对象,那么您的对象将被耦合到Guice。这就是Guice的工作方式。您可以通过创建自己的工厂接口并注入该接口来使用提供程序接口,但是您仍然需要在某个地方有一个@Inject,它将您与Guice耦合


我个人认为你应该重新考虑你对Guice有0个耦合的要求,但是如果你必须要写一些没有提到你的DI容器的类,你应该看看Spring之类的东西。

< P>你可能要考虑的一件事是从树干上构建Guice并使用它直到Guice 3被释放。然后你可以用的代替Guice的


Edit:除此之外,我通常认为,耦合到DI容器(在本例中,通过从
com.google.inject
导入某些内容)的问题比人们有时想象的要小。只要您不依赖于如何获得依赖项的详细信息(例如,到处注入
注入器
),就可以很容易地更改所有注入的
提供者
,以采用具有类似功能的自己的接口。根据功能强大的功能(如范围界定),您可以将自己与容器真正结合起来。考虑到它们为您节省了多少麻烦和精力,我认为这也不错。

是的,我研究了Spring查找方法,它使用cglib在运行时重写一个方法,这与我想要的非常接近。但没有必要让类100%不可知于Guice,我只是好奇:)我想我会坚持使用提供程序。我不确定你所说的“你的[sic]对象将与Guice耦合”是什么意思。Guice可以注入完全在Guice之外创建和维护的对象(通过创建提供程序)。@erickson,这是真的,但是您的代码中使用该类的部分必须耦合到注入器或提供程序。我想我的意思是,如果你想使用Guice,那么你的代码库中会有一些部分与之耦合,那么为什么不将这个特殊的可运行类与Guice耦合如此重要呢?我明白你的意思。是的,在某些级别(通常是非常高的级别,比如在初始化应用程序时),您当然需要创建Guice
Injector
并从中获取实例。当启动一个像这样的新线程时,有一个很好的机会拥有这种直接依赖性。我已经这样做了,它工作得很好。只有模块依赖于Guice。