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

两个带有依赖项注入的单例实例(Google Guice)

富建章
2023-03-14

我正在做一个使用依赖注入GoogleGuice框架的项目。

可以将类与singleton作用域绑定在一起,如下所示:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

如果类本身是一个真正的单例类:

public class FooImpl implements Foo{
    public static final FooImpl INSTANCE = new FooImpl();
    public static FooImpl getInstance(){...}
    // ...
}

或者

public class FooImpl implements Foo{
    private FooImpl instance = null;

    private FooImpl(){...}
    public static FooImpl getInstance(){
         if(instance == null)
             instance = new FooImpl();
         return FooImpl();
         // ...
    }

    // ...
}

因此,可以在项目中声明两个单例,第一个由Guice声明,第二个由getInstance()传统方式声明。

Google Guice还可以使用toInstance()方法将Interface绑定到特定实例。

因此,在Java中,用以下声明绑定Singleton,而不是绑定Singleton作用域,不应该是更好的方式:

bind(Foo.class).toInstance(FooImpl.getInstance());

而不是第一个?更安全吗?以这种方式有可能有两个单例实例吗?

使用Google Guice声明单身的最佳方式是什么?

共有1个答案

傅志文
2023-03-14

您建议的第一种方法是首选的:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

这允许Guice根据需要在FooImpl中执行依赖项注入。当您在上一个建议中使用toInstance()手动绑定到实例时,这是不可能的。

最后,单例设计模式是一种反模式,原因有很多。请注意,这指的是使用getInstance()等实现;在应用的生存期内拥有一个类的单个实例(如Guice的SINGLETON范围中的对象)无论如何都不错。

另请参见Guice关于作用域的页面,以了解singleton作用域的一些使用指南。

 类似资料:
  • 我有一个这样定义的单例实例: 现在,由于一些变化,这个类必须依赖于几个(3)依赖项。因此,这些依赖项必须在这里注入。 我们如何为这样设计的Singleton类实现依赖注入? 问题是,已经有很多调用方,因此无法使 getInstance 方法来接受依赖关系。 页(page的缩写)我知道使用单例并不总是一种更干净的方式:)(这是现有的代码,我不得不忍受它:) 附注:我正在使用Guice进行依赖注入。

  • 本文向大家介绍AngularJS 依赖注入详解和简单实例,包括了AngularJS 依赖注入详解和简单实例的使用技巧和注意事项,需要的朋友参考一下 AngularJS 依赖注入 什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后

  • 我的应用程序使用Play-2.4。2/Scala-2.11。6提供了对DI的内置GUI支持 我所有的DAO都将实现绑定到下面的接口,这应该是Guice中最简单的方法 上述实现不需要添加任何模块来提供绑定。 现在由于某种原因,我不想使用@Inject注释将依赖项注入到Books类的构造函数中。所以我试着注射如下 但这给我带来了一个guice配置异常,它说: 现在需要做什么?在这种情况下,我的方法是对

  • 本文向大家介绍php中的依赖注入实例详解,包括了php中的依赖注入实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php中的依赖注入。分享给大家供大家参考,具体如下: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 我到现在依然不大明白上面“依赖注入”的定义是什么…… 有兴趣可以参考下《PHP之道》上面对“依赖注入”的 解释。 htt

  • 我对嵌入式Cassandra的Spring单元测试有意见。问题是嵌入式Cassandra和我的Cassandra服务器同时启动。如何确保在单元测试期间只启动嵌入式Cassandra。 我正在为Cassandra使用Spring数据。 我有以下Spring配置文件。 我的上下文文件 我的测试用例如下: }

  • 本文向大家介绍对PHP依赖注入的理解实例分析,包括了对PHP依赖注入的理解实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了对PHP依赖注入的理解。分享给大家供大家参考,具体如下: 看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在