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

在 Guice 中重写绑定或子模块

公孙新觉
2023-03-14

我正在使用Google Guice编写一个组件,它位于一个不使用任何依赖注入工具的web应用程序旁边。

组件中的Guice模块有几个不会改变的“固定”绑定和几个动态绑定,因为它们在web应用程序的每个请求中都会改变。

我解决这个问题的最简单(也是最糟糕)的方法是,每当web应用程序第一次要求组件做某事时,组件就会构建新的Guice模块,创建实例并将其返回给web应用程序:

public static X init(@NotNull final Foo perRequestObject, @NotNull final Bar perRequestObject2)
{
    final Injector injector = Guice.createInjector(new AbstractModule()
    {
        @Override
        protected void configure()
        {
            install(new NonChanging Module());
            bind(Foo.class).toInstance(perRequestObject);
            bind(Bar.class).toInstance(perRequestObject2);
        }
    });
    return return injector.getInstance(X.class);
}

我认为这是一种糟糕的方法,因为根据请求构建注入器非常昂贵。我想要的是一个已经创建的注入器,我可以在运行时重写它。我在附近发现了一些东西:

1-覆盖动态绑定(答案https://stackoverflow.com/a/531110/1587864)。这仍然需要创建一个新的注入器,所以我会有同样的问题。

2-实现某种已经绑定在注入器中的工厂,并且能够访问来自Web应用程序并按请求的“动态”属性。

我不知道如何实现第二个,这个概念在Guice中存在吗?

谢谢

共有1个答案

庄子平
2023-03-14

正如评论所说,完整的正确解决方案是范围。假设您已经将本文中的<code>SimpleScope

public class MyWebComponent
{
  private final Provider<X> theGuiceCreatedObject;
  private final SimpleScope perRequestScope;

  public MyWebComponent() {
    perRequestScope = new SimpleScope();
    Injector injector = Guice.createInjector(new AbstractModule()
    {
        @Override
        protected void configure()
        {
            install(new NonChangingModule());
            bind(Foo.class).toProvider(SimpleScope.seededKeyProvider())
                .in(perRequestScope);
            bind(Bar.class).toProvider(SimpleScope.seededKeyProvider())
                .in(perRequestScope);
        }
    });
    theGuiceCreatedObject = injector.getProvider(X.class);
  }

  // I assume methods called makeFoo and makeBar that can make
  // a Foo or Bar for a request

  // called by the web service to say "handle this request"
  public RequestResult handleRequest(DataToMakeFooAndBarWith requestData) {
    try {
      perRequestScope.enter();
      perRequestScope.seed(Foo.class, makeFoo(requestData));
      perRequestScope.seed(Bar.class, makeBar(requestData));
      return theGuiceCreatedObject.get().doTheActualRequestLogic(requestData);
    } finally {
      perRequestScope.exit();
    }
  }
}
 类似资料:
  • 我最近开始使用Google Guice,通过我在网络上找到的教程和代码工作,但现在我被困住了。 我已经尝试创建了一个,我可以在每个实体DAO的基础上扩展该。我很难弄清楚如何配置一个现有的私有Guice模块。 这里是我的,其中是一个使用作为标识的实体。类是另一个不依赖于的实体(目前,我正在尝试让它一开始就简单)。 当尝试运行以下内容时,我会得到: Google Guice用户指南在这里没有真正帮助我

  • 我是一个尝试使用Guice的人(这里是新手!!)我的一个项目。 所以我有一个 我的实现是 我还将DataQueue接口定义为 DataQueue的实现如下 在我的AppModule.Configure方法中,我有以下代码 我的ConsumerFactory是一个带有create()方法的接口,该方法返回一个使用者 我的DataQueueFactory是一个带有create()方法的接口,该方法返回

  • 我有一个maven项目和一个maven项目,它依赖于项目。每个项目都有一个Guice模块,将一些类绑定到接口。 在javaruntime中,是一个接口IElementFactory和一个类,该类通过构造函数注入获得IElementFactory: IElementFactory的具体实现在androidruntime项目中,称为AndroidElementFactory。其他接口的所有实现都在ja

  • 由于绑定是在绑定模块中定义的,Google Guice 会在需要注入依赖项时使用它们。如果不存在绑定,它可以尝试创建即时绑定。绑定模块中存在的绑定称为显式绑定并且具有更高的优先级,而即时绑定称为隐式绑定。如果两种类型的绑定都存在,则考虑使用显式绑定进行映射。 以下是三种类型的即时绑定的示例。 绑定类型 描述 可注入的构造函数 非私有、无参数构造函数有资格进行即时绑定。另一种方法是使用@Inject

  • 主要内容:Google Guice 内置绑定 示例,输出Google Guice 为java.util.logging.Logger类提供了内置绑定。Logger 的名称会自动设置为注入 Logger 的类的名称。请参阅下面的示例。 Google Guice 内置绑定 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 主要内容:使用@Named 注解注入,Google Guice 常量绑定 完整示例,输出Guice 提供了一种使用值对象或常量创建绑定的方法。下面例子以配置 JDBC URL 为例。 使用@Named 注解注入 这可以使用 toInstance() 方法来实现。 Google Guice 常量绑定 完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。