在Guice对象图中获取对象

时间:2011-09-24 20:14:36

标签: java dependency-injection guice

我正在尝试为我正在发放的图书馆制作一个立面。在我的外观中,我使用Guice来构造对象图。对象图中的深层是Proxy对象,它具有getURL / setURL方法。 在我的外观中,如何获取用于创建根对象的Proxy实例?我希望我的门面有url getter和setter。

我试过这样的事情:

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);
    }
}

但inject.getInstance创建了一个新实例。

在MyModule中绑定:

bind(Proxy.class).to(HTTPProxy.class).asEagerSingleton();

我以前在外观构造函数中对对象图进行了硬编码,但是对于30个对象来说它很笨拙。

基本上,我需要在创建后在对象图中深入配置一个实例,但我不确定如何抓住该实例。

1 个答案:

答案 0 :(得分:1)

这看起来像一个很严肃的问题。但是,我无法弄清楚究竟是在问什么。

我的回答,看着代码并忽略了对象的图形说话(让我知道,如果我完全误解了你),是:
如果thing的{​​{1}}取决于某个SomeThing,则模块应将其配置为绑定到deep internal proxy。第二个HTTPProxy不会影响第一个getInstance。你能以某种方式做出使proxy影响thing的事情的唯一方法是,如果HTTPProxy被绑定in(Singleton.class),那么通过调用代理上的方法来影响{{1}的成员和行为这也可能是HTTPProxy内部的同一个实例,你可能正在做你正在寻找的东西。我不明白你为什么要这样做。请考虑编写一个配置thing和/或制作一个特殊模块的提供程序,仅供外观使用。