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

如何为一个现有的单例类使用guice注入?

戚承业
2023-03-14

我有一个已有的名为Legacy的类,它大部分是用旧学校的单例模式编写的。现在我想介绍一个新的领域,我想使用Guice。Legacy本身不受Guice控制,它由另一个服务类使用(在服务类内部,它调用Legacy类的getInstance()来检索Legacy对象),并且该服务类是使用Guice注入器创建的。

public class Legacy {

   public synchronized static Legacy getInstance() {
       if(sInstance == null) {
           sInstance = new Legacy();
       }
       return sInstance;
   }

   private Legacy() {
       legacyObj = LegacyField.getInstance(); // get a singleton
   }

   private static Legacy sInstance;

   private LegacyField legacyObj;

   private NewField newObj; // this is the new dependency I would like to add using Guice
}

我尝试的是将方法注入到Legacy类中

@Inject
public void setNewField(NewField newObj) {
  this.newObj = newObj;
}

并且在服务的模块文件中,我绑定了NewField对象,但是当我运行程序时,它抛出了NullPointer异常。所以注射不起作用。有没有想法让NewField注入我的程序,但保持目前的守旧的单例范例,而不改变太多的其他东西?

编辑下面至少有三个解决方案,我不太知道哪一个是最好的,或者它们是等同的。

共有1个答案

穆鸿飞
2023-03-14

我只是找到了另一种解决方法:

// put in the module
bind(Legacy.class).toInstance(Legacy.getInstance());

在本例中,您的模块本身而不是Guice负责获取一个遗留实例,然后要求Guice始终使用这个实例来完成所有遗留注入请求。但是根据创建注入器时的javadoc,它会自动为这个实例执行字段和方法注入,但是Legacy上的任何可注入构造函数都被简单地忽略了。请注意,使用这种方法会导致您无法控制的“急切加载”行为。

 类似资料:
  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 我正在做一个使用依赖注入GoogleGuice框架的项目。 可以将类与singleton作用域绑定在一起,如下所示: 如果类本身是一个真正的单例类: 或者 因此,可以在项目中声明两个单例,第一个由Guice声明,第二个由传统方式声明。 Google Guice还可以使用方法将Interface绑定到特定实例。 因此,在Java中,用以下声明绑定Singleton,而不是绑定Singleton作用域

  • 我是Guice注入的新手。如何将类注入到将在静态方法中使用的静态变量中? 这是我想在 doLocalize() 方法中使用注入的变量 b 的类。 这是我想要对其执行guice注入的模块类。 注意:我不能改变我的模块和B类,因为它来自另一个依赖项。 我想在我的A类中注入的类

  • 我有 对于这个特性,我有多个实现。。。 根据给定的类型,我想从一个实现中选择。类似这样的东西(伪代码): 所以2点: > 如何注入trait“Builder”的所有实现??我发现了很多问题都是朝着同一个方向发展的(使用multibinder、TypeLiteral等,但没有一个问题涉及注入所有实现。这只是关于“如何注入特定的实现”),我知道如何使用multibinder绑定多个实例;但如果它是一个

  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 使用play 2.5和guice,我成功地将Application ationConfig注入到一个单例类中,并引用其中的一个配置变量, 然后,我可以将这个单例传递给这样一个存储库类 这一切工作正常,正如预期的那样,但问题是我需要在测试套件中调用这个存储库,所以我不希望它必须接受任何参数(特别是注入的参数)。所以我试着把它改成在体内用注射器 这让人感觉它应该可以工作,并且编译得很好,但在测试或运行