使用guice时如何避免使用injector.createInstance()?

sme*_*sme 13 dependency-injection guice

有些东西我只是不了解guice:根据我到目前为止所读到的内容,我应该只在我的bootstrapping类中使用Injector(在独立的应用程序中,这通常是在main()方法中) ,如下例所示(取自guice文档):

public static void main(String[] args) {
    /*
     * Guice.createInjector() takes your Modules, and returns a new Injector
     * instance. Most applications will call this method exactly once, in their
     * main() method.
     */
    Injector injector = Guice.createInjector(new BillingModule());

    /*
     * Now that we've got the injector, we can build objects.
     */
    RealBillingService billingService = injector.getInstance(RealBillingService.class);
    ...
  }
Run Code Online (Sandbox Code Playgroud)

但是,如果不是所有我需要的对象都可以在启动期间创建?也许我想在应用程序运行时响应一些用户交互?我不是必须将我的注入器放在某处(例如作为静态变量),然后在需要创建新对象时调用injector.getInstance(SomeInterface.class)吗?

当然,在整个地方传播对Injector.getInstance()的调用似乎并不可取.

我在这里弄错了什么?

Gam*_*lor 13

是的,您基本上只应该使用Injector来创建获取根对象的实例.应用程序的其余部分不应触及Guice-Container.正如您所注意到的,您仍需要在需要时创建一些对象.有不同的方法可以做到这一点,每种方法都适合不同的需求.

注入提供 提供是Guice的接口.它允许您请求对象的新实例.该对象将使用Guice创建.例如.

 class MyService{
     private Provider<Transaction> transactionProvider;
     public MainGui(Provider<Transaction> transactionProvider){
         this.transactionProvider = transactionProvider;
     }

     public void actionStarted(){
         Transaction transaction = transactionProvider.get();
     }
Run Code Online (Sandbox Code Playgroud)

建造工厂 通常你需要某种工厂.该工厂使用一些注入的服务和一些参数,并为您创建一个新对象.然后,您将此工厂用于新实例.然后你注入那个工厂并使用它.使用AssistedInject -extension 也有帮助

我认为有了这两种可能性,你很少需要使用Guice-Injector本身.然而,有时仍然适合使用注射器本身.然后,您可以将Injector注入组件.