当前位置: 首页 > 知识库问答 >
问题:

使用Guice[复制]创建和初始化单例

史涵育
2023-03-14

我有一个以下类别的StorageProxy。java(接口)StorageProxyImpl1。java(StorageProxy接口的实现1)

public class StorageProxyImpl1 extends StorageProxy{
    public void init(String key){
      ....
    }
}

public class Resource1{
    private StorageProxy sp;
    ...
}

public class Resource2{
    private StorageProxy sp;
    ...
}

我在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提供依赖注入的指导,这样在创建新的实现时就不会有太大的麻烦。我希望Resource1和Resource2使用相同的StorageProxy对象(即它应该是Singleton)。init与构造函数分离是至关重要的。总之,我需要创建StorageProxyImpl1的一个实例并调用StorageProxyImpl1。main方法中的init(String),这个实例应该由Resource1和Resource2共享。如何做到这一点?

Guice中提出的问题:如何在没有注入器或使用构造器注入的情况下获得Singleton实例有点高级别,如果没有具体的例子,我发现很难理解。

共有1个答案

荆乐
2023-03-14

您可以使用提供程序接口

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();
    }
}
 类似资料:
  • 我不知道这是否是实现我的解决方案的更好方法: 该类是可序列化的,因为我从数据库的Json中获取内容,并将内容映射到对象GetFromJson中(我只需要在数据库中执行一次查询)。因为这个原因,我需要在我所有的应用程序中使用对象,因为这个原因,我认为我需要使用一个单例 有人给我发布了一个库来从数据库中获取JSON。JSON对象解析为,因此我创建了我的类。 现在我有很多rest服务,在我的rest服务

  • 我使用FFMPEG-segment对桌面上的视频捕获进行分段,并通过网络发送它们,以便提供给客户,并使用dash.js播放。问题是播放器正在搜索初始化段,而我似乎不知道如何创建它。 我使用以下ffmpeg命令创建段: 我为流创建的清单如下所示: 播放机调试模式打印以下内容: 如何为生成的段创建初始化段?我似乎无法让它起作用。

  • 考虑以下代码: 以下是一些引用的标准 拷贝初始化 从cppreference复制引用的初始化 如果object是lvalue表达式,其类型是T或从T派生的,且具有相等或较少CV限定性,则该引用绑定到由lvalue标识的对象或其基类子对象。 如果object是lvalue表达式,其类型隐式转换为T或从T派生的类型,具有相等或较少CV限定性,则考虑源类型及其基类返回lvalue引用的非显式转换函数,并

  • 我试图在登录后(从登录成功过滤器)获取用户的配置文件数据,但我发现延迟加载数据的异常。请参见以下示例代码: AuthenticationSuccessHandler。JAVA 用户服务。JAVA 用户模型。JAVA 用户登录响应to.java 当在中序列化UserLoginResponseDto类型的对象时,我会看到以下错误消息- org.hibernate.懒惰初始化角色集合失败:UserMod

  • 使用具有以下初始化的创建的等效版本是什么?

  • 我希望转换之间的HLS和MPEG破折号。我不能访问原始的完全串联的视频文件,只有个别的HLS段。 在进行到MPEG破折号的转换时,我需要为破折号manifest.mpd文件提供一个初始化段。 我的问题是: null 非常感谢。 更新:使用原始hls段的流代码段。视频一直在播放,但只是黑色的。