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

创建未绑定到注入器的Guice单例

谭志用
2023-03-14

我们的项目设置如下:

1)主模块:包含一个启动Spark流服务器的驱动程序。它有自己的Guice注入器。

2)当消息进来时,它进入另一个模块,该模块创建它自己的Guice注入器。

3) 此模块使用其他模块中的类,这些模块本身使用依赖模块。这些模块中的每一个都创建了自己的Guice注入器,因此可以独立工作、单独测试等。

这里有一个问题:现在我们需要一个单例,但是作为@Singleton创建的对象绑定到注入器(不是ClassLoader),所以当注入器离开时,对象就会消失。

问题:

1)我们的架构不好吗?我们不应该在每个模块中创建一个注入器吗?

2)我们如何创建一个即使注入器消失也会保留在ClassLoader中的单例?

顺便说一句,我们在指南上面使用网飞管理器。

注意:对于可能与此问题重复的问题的回答并没有回答如何将在顶级模块上创建的“单个”注入器传递给子模块。此外,如果子模块本身没有注入器,我们可以为它们编写独立的单元测试吗?

共有1个答案

督俊雅
2023-03-14

问题2的一个想法是使用一个提供程序,您可以在所有不同的模块中绑定该提供程序。该提供程序将访问Guice“外部”存在的单例。

我制作了一个简单的示例,其中提供了对静态字段的访问。您可以将其更改为使用适合您需要的单例模式的实现。

public class SingletonProvider implements Provider<TheSingleton> {

    private static final TheSingleton instance  = new TheSingleton();
    @Override
    public TheSingleton get() {
        return instance;
    }
}

然后我们将其绑定到不同的模块

public class Module1 extends AbstractModule {

    @Override
    protected void configure() {
       bind(TheSingleton.class).toProvider( SingletonProvider.class);
    }
}
public class Module2 extends AbstractModule {

    @Override
    protected void configure() {
       bind(TheSingleton.class).toProvider( SingletonProvider.class);
    }
}

然后我创建了两个不同的喷射器,返回相同的实例

public class Test {
    public static void main(String[] args) {
        Injector injector1 = Guice.createInjector(new Module1());

        TheSingleton instance = injector1.getInstance(TheSingleton.class);
        System.out.println("instance = " + instance);

        Injector injector2 = Guice.createInjector(new Module2());
        TheSingleton instance2 = injector2.getInstance(TheSingleton.class);
        System.out.println("instance2 = " + instance2);


    }
}
 类似资料:
  • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。

  • 我使用Guice进行依赖注入,但在我的特定用例中,它给了我这个错误:

  • 我想创建一个动态绑定实例到命名注释的模块。用例是我想自动绑定配置中的值,属性文件中的键是@命名值。 然而,配置绑定在不同的模块中,所以我需要注入配置。我看过的解决方案是: > 绑定在confiure()方法中。这个方法没有注入,我不能得到基本配置。 使用提供程序/@提供程序。提供程序只绑定一个实例。 使用多活页夹。我的用例与这个扩展提供的有点不同。多重绑定允许您单独绑定多个实例,然后将它们作为包含

  • 我可以阻止Guice向DemoInstance的构造函数提供DemoUnbound的实例吗? 从本质上说,我正在寻找一种在完全显式绑定模式下运行Guice的方法,其中注入未绑定的类是一个错误。 如何使Guice注入未绑定到模块中的类成为错误?

  • 我有一个用例,我使用的是基于Spring的外部jar,而我的代码是基于Googleguice的。 我正在尝试通过编写模块在我的依赖项jar的此类中注入依赖项。 外部类: 我可以在我的模块中使用@provides方法中的setter设置成员,但@inject成员为空,我得到了countEvent和durationEvent的NullPointerException。 我的代码使用下面的provide

  • 我希望能够通过辅助注入创建的对象来发现/注入创建对象的方法的名称。 我想做的一个例子: 不幸的是,到目前为止,我想到的实现这一点的唯一方法是 扩展辅助注射(通过复制和粘贴)以添加我的功能 写一些与辅助注射非常相似的东西,为我做这件事 写很多样板,在没有guices帮助的情况下做到这一点 我正在寻找一个解决方案,大致如下: < li >实现这一点的一些guice配置或模式 < li >实现此功能的一