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

向单例类注入依赖项

吕皓
2023-03-14

我有一个这样定义的单例实例:

public class Singleton {
    private static Singleton INSTANCE = new Singleton();

    private Singleton() {

    }

    public Singleton getInstance() {
        return INSTANCE;
    }
}

现在,由于一些变化,这个类必须依赖于几个(3)依赖项。因此,这些依赖项必须在这里注入。

我们如何为这样设计的Singleton类实现依赖注入?

问题是,在单例上已经有很多调用方,因此无法使 getInstance 方法来接受依赖关系。

页(page的缩写)我知道使用单例并不总是一种更干净的方式:)(这是现有的代码,我不得不忍受它:)

附注:我正在使用Guice进行依赖注入。

共有3个答案

乔凯康
2023-03-14

如果您使用的是Spring,即使没有公共构造函数,您也可以实现依赖项注入。只需将依赖项标记为@Autow的。Spring将通过反射注入它们。:)

澹台啸
2023-03-14

您可以使用Guice中的@Singleton注释来告诉注入器只创建一个在应用程序中共享的实例。然后,您可以通过注释变量或选择构造函数以常规方式注入依赖项

    @Singleton
    public class Singleton {

      @Inject // Choose to put the annotation here OR on a constructor, not both
      private Foo foo;

      @Inject // only put this constructor here if you don't annotate the variable
      public Singleton (Foo foo){
         this.foo = foo;
      }

      public Singleton getInstance() {
          return this;
      }

...
    }
董康平
2023-03-14

您可以将类重构为依赖项,同时为客户端保留相同的API
以Spring为例:

@Component
public class Singleton {

  private Foo foo;
  private Bar bar;
  private Any any;

  // inject dependencies 
  @Autowired
  // annotation not required in recent Spring versions
  public Singleton (Foo foo, Bar bar, Any any){
     this.foo = foo;
     this.bar = bar;
     this.any = any;
  }

  public Singleton getInstance() {
      return this;
  }
}

从客户端,您可以注入 Bean,也可以从 Bean 容器中检索它(如果客户端类不是 Bean)。

从bean类访问的示例:

public class SingletonClient{

    @Autowired
    private Singleton singleton;

    public void foo(){
        singleton.getInstance().method();
    } 
}

避免更改客户端类的想法
免责声明:我不提倡这种方式,因为它既违反直觉,又容易出错,而且最重要的是,维护了单例静态访问的技术债务
作为临时解决方案是可以接受的,但对现有代码的重构确实应该尽快执行。

因此,我们的想法是在构造函数调用期间将bean实例存储在静态字段中。
通过这种方式,辛格尔顿返回了豆子。

@Component
public class Singleton {

    private Foo foo;
    private Bar bar;
    private Any any;

    private static Singleton instance;

    // inject dependencies
    @Autowired
    // annotation not required in recent Spring versions
    public Singleton(Foo foo, Bar bar, Any any) {
      this.foo = foo;
      this.bar = bar;
      this.any = any;
      instance = this;
    }

    public static Singleton getInstance() {
      return instance;
    }

}
 类似资料:
  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper

  • 出自维基百科 Wikipedia: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 这句解释让依赖注入的概念听起来比它实际要复杂很多。依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。就是这么简单。

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