Java 使用Guice创建并初始化单例

Java 使用Guice创建并初始化单例,java,guice,Java,Guice,我在下列课程中有一门课 StorageProxy.java(接口) StorageProxyImpl1.java(StorageProxy接口的实现1) 我在Application类中有一个main方法,用于初始化和使用Resource1和Resource2 public class MyApp{ public static void main(String args[]){ Resource1 r1 = new Resource1(); Resource2 r2 = new

我在下列课程中有一门课 StorageProxy.java(接口) StorageProxyImpl1.java(StorageProxy接口的实现1)

我在Application类中有一个main方法,用于初始化和使用Resource1和Resource2

public class MyApp{
  public static void main(String args[]){
    Resource1 r1 = new Resource1();
    Resource2 r2 = new Resource2();
    runApp(r1,r2);
  }
  public void runApp(Resource1 r1, Resource2 r2){ // Makes use of r1 and r2
    ...
  }
}
我想为StorageProxy提供依赖注入的guice,这样在创建新的实现时就不会有太多的麻烦。我希望Resource1和Resource2使用StorageProxy的同一个对象(即它应该是Singleton)。init与构造函数分开是至关重要的。总之,我需要创建StorageProxyImpl1的一个实例,并在main方法中对其调用StorageProxyImpl1.init(String),这个实例应该由Resource1和Resource2共享。如何做到这一点

中提出的问题有点高,如果没有具体的例子,我很难理解。

您可以使用

公共类StorageProxyProvider实现提供程序{
public-StorageProxy-get(){
StorageProxy StorageProxy=新的StorageProxy();
storageProxy.init();
返回存储代理;
}
}
公共类StorageProxyModule扩展了AbstractModule{
受保护的void configure(){
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
一个有效的例子:

public class StorageProxyProvider implements Provider<StorageProxy> {

    public StorageProxy get() {
        StorageProxy storageProxy = new StorageProxy();
        storageProxy.init();
        return storageProxy;
    }

}


public class StorageProxy {

    public void init(){
        System.out.println("init");
    }
    public void proxy(){
        System.out.println("proxy");
    }

}

public class StorageProxyModule extends AbstractModule {
    protected void configure() {
        bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
    }
}


public class Example {
    @Inject
    StorageProxy storageProxy;

    public void doSomethingThatNeedStorageProxy() {
        System.out.println(storageProxy);
        storageProxy.proxy();
    }

}

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new StorageProxyModule());
        Example e = injector.getInstance(Example.class);
        e.doSomethingThatNeedStorageProxy();
        e = injector.getInstance(Example.class);
        e.doSomethingThatNeedStorageProxy();
    }
}
公共类StorageProxyProvider实现提供程序{
public-StorageProxy-get(){
StorageProxy StorageProxy=新的StorageProxy();
storageProxy.init();
返回存储代理;
}
}
公共类存储代理{
公共void init(){
System.out.println(“init”);
}
公共无效代理(){
System.out.println(“代理”);
}
}
公共类StorageProxyModule扩展了AbstractModule{
受保护的void configure(){
bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
}
}
公开课范例{
@注入
StorageProxy-StorageProxy;
public void doSomethingThatNeedStorageProxy(){
System.out.println(storageProxy);
proxy();
}
}
公共班机{
公共静态void main(字符串[]args){
Injector=Guice.createInjector(新的StorageProxyModule());
示例e=injector.getInstance(Example.class);
e、 doSomethingThatNeedStorageProxy();
e=injector.getInstance(Example.class);
e、 doSomethingThatNeedStorageProxy();
}
}

很抱歉一直有问题。。。我是新来的Guice。。。如果我使用这个方法,我会得到一个空指针异常。我假设资源类中有storageProxyProvider。。有什么问题吗?还有,您是如何创建注入器的?我在回答中添加了一些代码,看一看,我测试了这个示例,它可以正常工作。告诉我你有没有其他的dubts很好。。。最后一个问题。。。如何在示例类中初始化storageProxyProvider?我修复了singleton的一个问题,请更新。在示例类中,我们只需要StorageProxy,Guice将完成所有工作。
public class StorageProxyProvider implements Provider<StorageProxy> {
   public StorageProxy get() {
      StorageProxy storageProxy = new StorageProxy();
      storageProxy.init();
      return storageProxy;
   }
}

public class StorageProxyModule extends AbstractModule {
   protected void configure() {
     bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
   }
}
public class StorageProxyProvider implements Provider<StorageProxy> {

    public StorageProxy get() {
        StorageProxy storageProxy = new StorageProxy();
        storageProxy.init();
        return storageProxy;
    }

}


public class StorageProxy {

    public void init(){
        System.out.println("init");
    }
    public void proxy(){
        System.out.println("proxy");
    }

}

public class StorageProxyModule extends AbstractModule {
    protected void configure() {
        bind(StorageProxy.class).toProvider(StorageProxyProvider.class).in(Singleton.class);
    }
}


public class Example {
    @Inject
    StorageProxy storageProxy;

    public void doSomethingThatNeedStorageProxy() {
        System.out.println(storageProxy);
        storageProxy.proxy();
    }

}

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new StorageProxyModule());
        Example e = injector.getInstance(Example.class);
        e.doSomethingThatNeedStorageProxy();
        e = injector.getInstance(Example.class);
        e.doSomethingThatNeedStorageProxy();
    }
}