2011-07-28 81 views
3

假設我有一個類ListCreator我想配置。我想能夠告訴它排序順序以及如何輸出我的表格。因此,我有布爾型sortDescending屬性和TableWriter接口,該接口由PdfTableWriter(但也由XlsTableWriter)實現。 在這個例子中,我認爲配置和DI是齊頭並進的。我想寫點東西像今年春季(僞)例如:Java配置和依賴注入(類似於Springs IoC vs. Weld/Guice)

<beans> 
    <bean id="ListCreator" class="ModularListCreator"> 
     <property name="tableWriter"> 
      <ref local="TableWriter"/> 
     </property> 
     <property name="sortDescending"> 
      <value>true</value> 
     </property> 
    </bean> 
    <bean id="TableWriter" class="PdfTableWriter"> </bean> 
</beans> 

現在Spring能做到這一點,但它似乎是焊接&吉斯不能。例如Weld可以讓你在beans.xml中選擇備選項,但僅限於整個應用程序。如果我想同時有一個用於PDF的ListCreator以及另一個用於XLS?

我現在還沒有得到Weld和Guice的範圍,因爲他們似乎沒有允許很多配置。似乎只是減輕了編寫new或實施自己的工廠的需要。例如,EJB注入也是如此,這很好,但整個配置部分在哪裏(選擇哪個實例具有我實際需要的參數)。

來到真正的重點:我做不是想要使用Spring,因爲它似乎是開銷。我更願意使用JSR指定的最好的清潔和最小的東西。有什麼建議麼?

回答

0

Guice實際上爲您提供了很多配置功能。假設我正確地理解了你,下面是Guice中使用模塊中的提供者方法的一種方法的簡單示例。

protected void configure() { 
    bind(TableWriter.class).to(PdfTableWriter.class); 
} 

@Provides 
protected ListCreator provideListCreator(TableWriter tableWriter) { 
    ModularListCreator result = new ModularListCreator(); 
    result.setTableWriter(tableWriter); 
    result.setSortDescending(true); 
    return result; 
} 

還有其他的方法也一樣,包括製造setSortDescending使用綁定註釋:

@Inject public void setSortDescending(
    @Named("sortDescending") boolean sortDescending) 

,然後綁定屬性:

protected void configure() { 
    bind(TableWriter.class).to(PdfTableWriter.class); 
    bindConstant().annotatedWith(Names.named("sortDescending")).to(true); 
    bind(ListCreator.class).to(ModularListCreator.class); 
} 
+0

但這樣我再次在我的代碼中硬連線。 –

+0

@ samy-delux:如果您構建代碼來部署更改,那麼這不是問題。您是否經常在沒有新構建的情況下更改已部署實例的XML?無論如何,把你想要重新配置的東西拿出來比較容易,而不需要編譯。例如,您可以將「sortDescending = true」放入屬性文件中,並使用Names.bindProperties將其與文件進行綁定。 – ColinD

+1

儘管在改變內部行爲(切換類的實現)時重構項目的合理性仍然存在,但我仍然認爲Spring在配置文件中如何做得更乾淨。我將如何配置多個'ListCreator'的屬性?該屬性文件會變得混亂。 Spring之外沒有別的東西嗎? –

0

對於CDI,結賬縫焊接。它增加了從xml文件輕鬆配置Managed Beans的功能。從Seam和Weld團隊之間的密切關係來看,這種機制很有可能成爲未來的JSR。

0

InPUT提供了一種方法,如果你想要一個靈活的基於描述的解決方案。我創建了整個示例,並將其添加到example section

的代碼很小,與:

Design config = new Design("config.xml"); 
ListCreator creator = config.getValue("ListCreator"); 

假設你有一個配置。XML輸入設計其中包含輸入語法設置:

<SValue id="ListCreator"> 
    <NValue id="SortDescending" value="false"/> 
    <SValue id="TableWriter" value="Xls"/> 
</SValue> 

對於這個工作,你必須定義設計空間如下:

<SParam id="ListCreator"> 
    <NParam id="SortDescending" type="boolean" /> 
    <SParam id="TableWriter"> 
     <SChoice id="Xls"/> 
     <SChoice id="Pdf"/> 
    </SParam> 
</SParam> 

現在您量身定製的編程語言獨立設計空間到你的Java實現代碼映射

<Mapping id="ListCreator" type="test.ListCreator" constructor="TableWriter SortDescending"/> 
<Mapping id="ListCreator.TableWriter" type="test.TableWriter"/> 
<Mapping id="ListCreator.TableWriter.Xls" type="test.XlsTableWriter"/> 
<Mapping id="ListCreator.TableWriter.Pdf" type="test.PdfTableWriter"/> 

從這裏,擴展和自定義的自由意志,而不接觸代碼。您提到了多個ListCreator實例的情況。你將不得不作出3個改變:

1)的設計空間:

<SValue id="ListCreator" type="[]"> 

2)設計(例如):

<SValue id="ListCreator"> 
    <SValue id="1"> 
     <NValue id="SortDescending" value="true"/> 
     <SValue id="TableWriter" value="Pdf"/> 
    </SValue> 
    <SValue id="2"> 
     <NValue id="SortDescending" value="false"/> 
     <SValue id="TableWriter" value="Xls"/> 
    </SValue> 
</SValue> 

3)準備好接收一個數組代替(代碼):

ListCreator[] creators = config.getValue("ListCreator"); 

您可以決定描述符中的數量和選項; 條目按照定義的順序到達。這適用於多維度(例如「[] [] []」)。您可以在將來添加具有更多參數的備用表編寫器,或更改當前參數,而無需在調用方修改代碼。只要確保所有課程都可用,並對其進行測試。有一些錯誤來源(拼寫錯誤)。