2014-11-03 66 views
0

我有以下情形:注入值將被注入

public class InjectionTest { 
    private static class Sub { 
     @Inject private final String value = null; 
    } 
    private static class General { 
     @Inject private final Sub sub = null; 
    } 
    private static class MainOne { 
     @Inject private final General general = null; 
    } 
    private static class MainTwo { 
     @Inject private final General general = null; 
    } 
    public static void main(String... arguments) { 
     Injector injector = Guice.createInjector(new AbstractModule() { 
      @Override protected void configure() { 
       /* DO MAGIC */ 
      } 
     }); 
     MainOne mainOne = injector.getInstance(MainOne.class); 
     MainTwo mainTwo = injector.getInstance(MainTwo.class); 
     assertThat(mainOne.general.sub.value, is("one")); 
     assertThat(mainTwo.general.sub.value, is("two")); 
    } 
} 

我想從MainOne實例的value訪問是"one"valueMainTwo實例訪問是"two"。我曾嘗試以下:

  • 使用Guice的Named註釋;不幸的是,這需要我自己創建General實例或使用子注入器來創建Sub實例。
  • 使用Guice的Scope機制。我無法真正按照我想要的方式讓它工作,並感覺它從來沒有打算這樣做,事實上,即使也不能這樣做。

(當然實際情況比較複雜,一如既往:我有一個GuiceServletContextListenerServletModule和我想要重用幾個類/所有創建Servlet實例之間的服務,而且還需要一對夫婦專門從servlets中請求的模塊。)

我錯過了什麼嗎?有一種(相對)簡單的方法來實現我想要的嗎?

+2

這就是所謂的「機器人腿」的問題。這是Guice的建議:https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of-objects – 2014-11-03 14:33:42

回答

2

首先,你不應該注入最後的領域(見評論)。我建議你刪除final修飾符,或使用構造函數注入。

可以通過使用私有模塊來解決您的示例。但我不認爲這是一個「簡單」的解決方案。

Injector injector = Guice.createInjector(new PrivateModule() { 
     @Override 
     protected void configure() { 
      bind(String.class).toInstance("one"); 
      bind(MainOne.class); 

      expose(MainOne.class); 
     } 
    }, new PrivateModule() { 
     @Override 
     protected void configure() { 
      bind(String.class).toInstance("two"); 
      bind(MainTwo.class); 

      expose(MainTwo.class); 
     } 
    }); 

我想你最好不要使用任何@Named或創建自己的綁定註釋。

又讀了「機器人腿」問題的wiki頁面: https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of-objects

+0

其實你[可]( https://github.com/google/guice/wiki/Injections#field-injection)注入最終字段,但這不是一個好主意。 – 2014-11-03 19:46:35

+0

這是一個壞主意。這就是爲什麼它只適用於'@ com.google.inject.Inject'註釋。如果你使用'@ javax.inject.Inject'來試試這個,Guice 3.0會失敗並帶有'CreationException'。 – eiden 2014-11-04 09:36:41