繁体   English   中英

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

[英]How to use guice injection to inject a Class in a class with static methods?

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

}

我想注入我的班级中的班级

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

使用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非静态方法上进行操作。

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

我建议:

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字段在多线程环境中具有一定的保证。

写完这些之后,我想知道为什么您需要A类。 相反,可以将任何代码调用A.doLocalize()替换为B实例吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM