2015-11-13 70 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實例嗎?