2012-03-22 58 views
1

是否有簡單的方法將簡單的原始類型參數(字符串和int)注入到bean中?如何使用Guice向bean注入簡單的配置參數?

我需要做的是找到吉斯相當於像這樣從spring.xml:

<bean id="aBean" ...> 
    <property name="fieldName" value="aStringValue"/> 
    <property name="anotherFieldName" value="123"/> 
</bean> 

值可能是構造注射,注射領域或方法注入,但我不希望使用爲需要傳遞給bean的每個值分別命名註釋或工廠或提供程序。

編輯:我的解決方案

這裏是我終於來到了。我認爲這與我所尋找的最接近,但任何改進都會受到歡迎。

我發現,在該模塊中,我可以聲明一個供應商的方法,並用它來設置,我需要的任何屬性:

MyModule extends AbstractModule{ 
... 
    @Provides @Named("testBean") MyTestBean createTestBean(MembersInjector<TestBean> mi){ 
     TestBean test = new TestBean(); 
     mi.injectMembers(test); 
     test.setFieldName("aStringValue"); 
     test.setAnotherFieldName(123); 

     return test; 
     } 
... 
} 

好的一點是,它提供一些方法爲bean替代了BIND()這樣實際的線數不會增加太多。

我仍然不是100%確定任何副作用,但它看起來很有前途。

+0

你試過谷歌嗎? (例如http://code.google.com/p/guice-xml-config/) – Romain 2012-03-22 12:20:49

+0

如果我必須使用xml,我寧願不從spring中遷移:) – Rado 2012-03-22 12:47:26

+0

那麼,「從spring.xml 「聽起來像是對我來說顯然是XML。也許如果你提到你不想要XML?但在這種情況下還有什麼? PLIST?它有多好? – Romain 2012-03-22 12:51:33

回答

1

有一種構建機制來注入屬性。

屬性文件:

name=jan 
city=hamburg 

模塊

@Override 
protected void configure() { 
    Names.bindProperties(binder(), properties); 
} 

然後在你的bean,只是名稱注入

class Customer { 
    @Inject 
    @Named("name") 
    String name; 
    .... 
} 
+0

嗨,我不能使用命名的屬性,因爲各種原因,但也不喜歡的方法,因爲它污染了很多值的噴油器和生成名稱衝突。 – Rado 2012-03-26 07:18:06

0

有幾種不同的方法可以做到這一點,包括你的方式。使用Provider方法的唯一缺點是它本質上是一個手工卷繞的工廠,您必須記住要維護它。 (在這個特定的情況下,你也沒有從構造器注入中獲得好處)。

如果沒有提供方法,則必須使用某種綁定註釋。如果@Named不適合你,那麼你需要爲每個綁定創建一個註釋。

bindConstant().annotatedWith(FieldName.class).to("aStringValue"); 

public SomeClass { 
    public void setFieldName(@FieldName String fieldname) {} 
} 

在某些情況下,這可能需要對每個原始/ String實例1:1的註釋被束縛。但是我嘗試使我的註釋與正在描述的實際實例有點正交,而寧願使用註釋來描述綁定對象和注入點之間的關係。

這並不總是可能的,但是隻要每個基元類型僅在集合中使用一次,那麼整個相關基元組就可以通過單個綁定註釋來描述。所以,這可以假設工作:

bindConstant().annotatedWith(MyAnnotation.class).to("aStringValue"); 
bindConstant().annotatedWith(MyAnnotation.class).to(123); 

順便,我很好奇,爲什麼你不能使用的財產@Named註解,但你可以注入豆使用它們?