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

Guice:使用注射器?

邢和光
2023-03-14

我有一个Maven模块,我在其中定义了一些跨其他几个Maven模块共享的UTIL。在本模块中,我想创建一些单例:

package org.me.util;

public interface Baz {
    String myMethod(String s);
}

@Singleton
public class Foo implements Baz {
private Bar bar;

    @Inject
    Foo(Bar bar) {
        this.bar = bar;
    }

    @Override
    public String myMethod(String s) {
        return s;
    }

}

然后我将我的界面绑定到:

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Baz.class).to(Foo.class);
    }

}

假设我想使用另一个Maven模块(比如web服务)中的这个单例,我该如何实现呢?我找到的唯一方法是在util Maven模块中创建一个类,如:

package org.me.util;
public class Main {

    private static Injector injector = Guice.createInjector(new MyModule());;

    public static Injector getInjector() {
        return injector;
    }

或者,我可以在Guice教程中看到的静态main方法中创建注入器,并将实例保存在某个地方。

然后从我的Web服务中执行以下操作:

Baz baz = Main.getInjector().getInstance(Baz.class);    

但这似乎不是很优雅,因为我必须传递我的注射器(在这种情况下,通过为其提供静态吸气剂)。

还有别的办法吗?谢谢

共有1个答案

阴元青
2023-03-14

传递Baz对象的更优雅的方法是注入它。

例如

 public class BusinessService {
     private final Baz baz;
     @Inject
     public BusinessService(Baz baz) { this.baz = baz; }
 }

如果您想在WS中使用BusinessService,请再次访问。

 public class WebService {
     private final BusinessService businessService;
     @Inject
     public WebService(BusinessService businessService) { this.businessService = businessService; }
 }

通过这样做,所有依赖项都清楚地暴露在API签名中。

剩下的问题是,您必须在应用程序的入口点创建喷油器。

在独立应用程序中,喷油器通常是在main方法中创建的。

public static void main(String[] args) {
     Injector injector = Guice.createInjector(new UtilModule(), new BusinessModule());
     BusinessService businessService = injector.getInstance(BusinessService.class);
     ...

}

在Web应用程序中,注入器可能以不同的方式创建。这取决于框架。

Servlet:

  • guice servlet模块

删除向导:

  • dropwizard-guice
  • dropwizard-guicey

playframework

  • 播放模块

...

 类似资料:
  • 我使用< code>Cucumber和< code>Guice作为DI。我遇到了以下问题:我有一个步骤,即 我让这个类作为测试运行它 有一个 由我的使用,我定义了cucumber.properties,我定义了还有一个包含方案的功能文件。现在一切都在工作。 不,我想使用其他MyService实现运行MyStep步骤(当然我不会重复MyStep的代码)我定义了一个具有新场景和新测试类的新功能文件 现

  • 我对使用Guice有疑问。我有一个名为< code>Main的类,它是使用Guice和一个方法注入的构造函数,每次调用该方法都会创建一个类< code>AppThread的o thread对象。< code>AppThread是< code>Main中的私有类。问题是,在线程的执行过程中,我想创建一个class 的对象。此对象是使用Guice注入的构造函数。我不知道注入< code>ClassX的

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我更新了createInjector调用以包含我的JPAPersisteModule。。。 在我的持久化单元声明如下:

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

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