如何使用guice注入在类中使用静态方法注入类?

时间:2015-11-13 17:10:33

标签: java dependency-injection static guice inject

我是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
    }
}

2 个答案:

答案 0 :(得分:0)

使用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())));
}

答案 1 :(得分:0)

我建议在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是最终的,这很好,因为您不希望它是更改,因为最终字段在多线程环境中具有某些保证。

写完这篇文章后,我不禁要问你为什么需要A课程。相反,无论代码调用A.doLocalize()而不是注入B实例?