class A {
public A() {
}
}
class B {
@Inject
@Named("A")
private A a;
public B() {
}
public A getA() {
return a;
}
}
class AModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
@Named("A")
public A providesA() {
return new A();
}
}
我们是这样做的:
AModule module = new AModule();
Injector injector = Guice.createInjector(module);
B b = injector.getInstance(B.class);
System.out.println(sample.getA());
但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。
那么,有没有办法在创建B的实例时自动注入A的实例?
按照您在问题中的建议,创建尽可能多的顶级喷油器(通常)是不正确的。创建注入器的成本很高,一旦Guice计算了依赖关系图,就不需要重新计算。一般来说,应用程序中应该有一个顶级注入器,其他任何注入器要么是“子注入器”,要么是单独的、不相关的对象图的一部分。
从“最差”到“最佳”:
如果要将DI引入大量现有或遗留代码,那么可能很容易将注入器隐藏到可公开访问的html" target="_blank">对象中。
public class InjectorHolder() {
private InjectorHolder() {} // Not instantiable
private static Injector injector;
public static void initializeInjector() {
injector = Guice.createInjector(new AModule(), new BModule(), andSoOn());
}
public static Injector get() {
return injector;
}
public static B getB() {
return injector.getInstance(B.class);
}
}
此时,您可以调用InjectorHolder。get()。getInstance(B.class)或InjectorHolder。getB()
从您目前迁移的应用程序部分获取。请注意,这可能很难测试,并且直接依赖于整个应用程序中的Guice,这两种情况都不理想。
Guice为静态注入提供了一些特性,特别是方法调用requestStaticInjection(类…类型)
。通过在模块中调用它,Guice将在创建注入器后立即注入带有@inject
注释的静态成员。
public class StaticBModule extends AbstractModule() {
@Override public void configure() { requestStaticInjection(BFactory.class); }
}
public class BFactory() {
@Inject @Named("B") private static Provider<B> bProvider;
public B get() {
return bProvider.get();
}
}
现在,您可以调用new BFactory(). get()
而不是new B()
,并且它都将进入同一个注入器。自然地,如果您放置一个静态提供程序,您也可以允许
new B()
你也可以参考这个SO问题,它有一个例子。
您已经向我们展示了
A
和B
,但可能其他一些类C
使用了B
的许多实例,并且可能您的应用程序
(其中包含您的静态main
方法)使用了C
。您可以使用Guice创建应用程序
或C
的实例,然后C
可以包含一个注入的提供程序
这样,您的类完全依赖于它们所依赖的内容,除了在顶层之外,没有静态状态或对Guice的引用。
首先,我不得不说,我试着用谷歌搜索这个问题的答案,但没有任何答案可以解释我的怀疑。总之,我想了解的是: 此接口有两种不同的实现: 我将在以下示例中使用这些实现: 更新1.1至帖子 我还有一个类使用相同的“动物”界面: 所以我的问题是:1-我如何知道将向AnimalStateManager注入什么实现?2-如果我想强迫“AnimalStateManager”上的“动物”对象成为猫,该怎么办? 更新1
我正在开发一个现有的Java代码库,该代码库使用Guice进行依赖注入。我有一个新的类 Foo,其中包含一个我想注入的成员字段(bar)。喜欢这个: 然而,有两件事: 使用Foo的注射器无法直接进入 客户端希望使用“new”创建Foo 当客户端执行以下操作时,是否仍然可以将Bar注入Foo对象: 我对DI和Guice非常陌生,不太明白如何在不调用injector.createInstance()的
我有 对于这个特性,我有多个实现。。。 根据给定的类型,我想从一个实现中选择。类似这样的东西(伪代码): 所以2点: > 如何注入trait“Builder”的所有实现??我发现了很多问题都是朝着同一个方向发展的(使用multibinder、TypeLiteral等,但没有一个问题涉及注入所有实现。这只是关于“如何注入特定的实现”),我知道如何使用multibinder绑定多个实例;但如果它是一个
在Scala中,我可以使用Guice注入Scalas吗? 例如,我可以在以下对象中注入?
我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?
问题内容: 我正在阅读Guice文档,并且遇到了一个标题为“ 消除周期”(推荐)的部分,这引起了我的极大兴趣,因为正是这个问题才导致我今天使用该文档。 基本上,要消除循环依赖性,您可以“将依赖性案例提取到单独的类中”。 好的,那里没有新内容。 因此,在示例中,我们有。 您有一个和一个,每个都需要引用的一个实例。这个概念没有问题,并且可以通过经典的依赖注入轻松实现: 这很容易,但是现在,我需要通过G