如何重用Google Guice中对象的现有实例?

时间:2019-06-30 05:36:49

标签: java guice

我是Google Guice的新手。到目前为止,似乎每次创建新绑定时都会创建一个新对象。如果在两个不同的类中有两个相同的对象作为构造函数参数(或字段等),则如何重用该对象的第一个实例作为第二个对象的构造函数参数?例如:

public interface MyInterfaceA{
    //Method declarations
}
public class MyClassA implements MyInterfaceA{
    private MyInterfaceC myField;

    @Inject
    public MyClassA(MyInterfaceC myField){
        this.myField = myField;
    }

    //Methods, etc.
}
public interface MyInterfaceB{
    //Method declarations
}
public class MyClassB implements MyInterfaceB{
    private MyInterfaceC myField;

    @Inject
    public MyClassB(MyInterfaceC myField){
        this.myField = myField;
    }

    //Methods, etc.
}
public interface MyInterfaceC{
    //Method declarations
}
public class MyClassC implements MyInterfaceC{

    @Inject
    public MyClassC(){
        //Implementation
    }

    //Methods, etc.
}
public class MyModule extends AbstractModule{
    @Override
    protected void configure(){
        bind(MyInterfaceA.class).to(MyClassA.class);
        bind(MyInterfaceB.class).to(MyClassB.class);
        bind(MyInterfaceC.class).to(MyClassC.class);
    }
}

在此示例中,我认为MyGuest的构造函数是通过带有新MyClassC实例的Guice来调用的,而MyClassB的构造函数也是通过MyClassC的新实例来调用的。我该如何首先使用MyClassC的新实例来调用MyClassA的构造函数,然后再使用带有Guice的MyClassC的相同实例来调用MyClassB的构造函数?

1 个答案:

答案 0 :(得分:1)

由于@ njzk2已经对此进行了评论,我只是在下面添加代码。每次注入MyClassC时,都会为它提供相同的对象实例。

public class MyModule extends AbstractModule{
    @Override
    protected void configure(){
        bind(MyInterfaceA.class).to(MyClassA.class);
        bind(MyInterfaceB.class).to(MyClassB.class);
        bind(MyInterfaceC.class).to(MyClassC.class).in(Singleton.class);
    }
}