2015-11-13 81 views
1

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

这是我想在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 
    } 
} 
+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()))); 
} 
+0

heh。因此在应用程序启动过程中与'A.b = injector.get(B)'基本相同。 – ZhongYu

+0

这可以完成所有注入(在本例中只有一个项目),它是它所属的地方(在模块中不是在启动过程中)。 –

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是最终的,whic h是好的,因为你不希望它发生变化,因为最终字段在多线程环境中有一定的保证。

写完后,我不得不想知道为什么你需要A类。相反,无论代码调用A.doLocalize()而是注入B实例吗?