Java 在Guice对象图中获取对象
我正试图为我正在分发的图书馆做一个门面。在facade中,我使用Guice构建对象图。在对象图的深处是一个代理对象,它具有getURL/setURL方法。 在facade中,如何获取用于创建根对象的代理实例?我希望我的外观具有url getter和setter 我试过这样的方法:Java 在Guice对象图中获取对象,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正试图为我正在分发的图书馆做一个门面。在facade中,我使用Guice构建对象图。在对象图的深处是一个代理对象,它具有getURL/setURL方法。 在facade中,如何获取用于创建根对象的代理实例?我希望我的外观具有url getter和setter 我试过这样的方法: public class SomeThingFacade() { private final SomeThing thing; private final HTTPProxy proxy;
public class SomeThingFacade() {
private final SomeThing thing;
private final HTTPProxy proxy;
public SomeThingFacade() {
MyModule module = new MyModule();
Injector injector = Guice.createInjector(module);
// this is the main class I'm making a facade for
this.thing = injector.getInstance(SomeThing.class);
// deep in the "thing" object graph is a Proxy implementation
this.proxy = injector.getInstance(HTTPProxy.class);
}
public void setURL(URL url) {
this.proxy.setURL(url);
}
}
但是injector.getInstance创建了一个新实例
MyModule中的绑定:
bind(Proxy.class).to(HTTPProxy.class).asEagerSingleton();
我以前在facade构造函数中硬编码了对象图,但是它很难处理30个对象
基本上,我需要在创建后在对象图的深处配置一个实例,但我不确定如何获得该实例。这看起来是一个非常严肃的问题。然而,我不知道到底问了什么 我的答案是:
如果
thing
的SomeThing
依赖于深层内部代理
,则模块应将其配置为绑定到thing的HTTPProxy
。第二个getInstance
不影响第一个。您可以通过某种方式做一些事情,使proxy
影响thing
的唯一方法是将HTTPProxy绑定到(Singleton.class)中,然后通过调用代理上的方法来影响HTTPProxy
的成员和行为,这也是thing
内部的同一个实例,您可能正在做您想要做的事情。我不明白你为什么要这样做。不要考虑编写一个提供代码“HTTPProxy > <代码>和/或只为外观使用的特殊模块的提供者。 这看起来完全是一个很严肃的问题。然而,我不知道到底问了什么
我的答案是:如果
thing
的SomeThing
依赖于深层内部代理
,则模块应将其配置为绑定到thing的HTTPProxy
。第二个getInstance
不影响第一个。您可以通过某种方式做一些事情,使proxy
影响thing
的唯一方法是将HTTPProxy绑定到(Singleton.class)中,然后通过调用代理上的方法来影响HTTPProxy
的成员和行为,这也是thing
内部的同一个实例,您可能正在做您想要做的事情。我不明白你为什么要这样做。不要考虑编写一个提供代码“HTTPProxy > <代码>和/或只为外观使用的特殊模块的提供者。基本上,我需要在创建后在对象图中配置一个实例,但是我不知道如何得到那个实例的保存。我想我暗示了你并没有真正掌握它。除非是单身。使用注入,必须在注入对象之前对其进行配置。在这种情况下,您的模块应该为对象或提供者定义一个提供方法。可能带有特定于实例的注释。因此,如果您的facade需要一个新的代理配置,请为facade定义一个特定的模块来实现这一点。基本上,我需要在创建后在对象图的深处配置一个实例,但我不确定如何获得该实例。我想我暗示您没有真正获得它,除非它恰好是一个单实例。使用注入,必须在注入对象之前对其进行配置。在这种情况下,您的模块应该为对象或提供者定义一个提供方法。可能带有特定于实例的注释。因此,如果您的facade需要一个新的代理配置,那么为facade定义一个特定的模块来实现这一点。