【问题标题】:How to use guice injection to inject a Class in a class with static methods?如何使用 guice 注入在具有静态方法的类中注入一个类?
【发布时间】:2016-02-15 08:34:44
【问题描述】:

我是 Guice Injection 的新手。如何将一个类注入到我将在静态方法中使用的静态变量中?

这是我想在 doLocalize() 方法中使用我注入的变量 b 的类。

public class A {
   @Inject //Trying to inject this class
   private static B b;

   // Private constructor to prevent initialization.
   private A() {}

   public static String doLocalize(String word) {
       return b.localize(word);
   }
}

这是我想要执行 guice 注入的 Module 类。

注意:我无法更改 MyModule 和 B 类,因为它来自另一个依赖项。

public class MyModule extends AbstractModule {
   public void configure() {
       bind(B.class);
       // some other binds
   }

}

我想在我的 A 类中注入的类

public class B {
    public String localize(String word) {
        //does some stuff
        //returns a modified string
    }
}

【问题讨论】:

  • 嘿。我的回答能回答问题还是你仍然卡住?

标签: java dependency-injection static guice inject


【解决方案1】:

使用requestStaticInjection。这在wiki 中有描述。

注意:我无法更改 MyModule 和 B 类,因为它来自另一个依赖项。

然后您将需要一个新模块。

class A {
    @Inject
    public static B b;
    static void a(){b.b();}
}
class B {
    @Inject public PrintStream out;
    void b() { out.println("Value: b"); }
}

class MyModule extends AbstractModule {
    public void configure() {
        bind(B.class);
        bind(PrintStream.class).toInstance(System.out);
    }
}

class AModule extends AbstractModule {
    public void configure() {
        requestStaticInjection(A.class);
    }
}

@Test
public void test() {
    Guice.createInjector(new AModule(), new MyModule()); // Can be in any order
    A.a();
    assertThat(A.b, is(not(nullValue())));
}

【讨论】:

  • 嘿。所以在应用启动时与A.b=injector.get(B)基本相同。
  • 这完成了所有的注入(在这种情况下只有一项),它是它所属的地方(在模块中而不是在启动期间)。
【解决方案2】:

出于几个原因,我建议将 A 上的方法设为非静态。

  • 很难对调用引用外部服务的静态方法的代码进行单元测试
  • 使用静态会使您的代码更难线程安全
  • 静态字段有时会导致内存泄漏

我建议:

public class A {
   private final B b;

   @Inject
   private A(B b) {
     this.b = b;
   }

   public String doLocalize(String word) {
       return b.localize(word);
   }
}

请注意,b 是 final,这很好,因为您不希望它被更改,并且 final 字段在多线程环境中具有一定的保证。

写完这篇文章后,我想知道为什么你需要A 类。相反,任何调用A.doLocalize() 的代码都可以注入B 实例吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多