2012-03-27 38 views
2

我有一個實現Action接口的動作列表。用Guice(或Spring)注入列表

FooAction implements Action 
BarAction implements Action 

我希望能夠處理列表中的每個動作: -

List<Action> actions = new ArrayList<Action>; 
.. 

for(Action action : actions) 
    action.process(); 

是否有可能得到吉斯(或彈簧!)注入所有的個體行爲納入了動作列表? 我知道我可以編寫代碼來手動創建一組這樣的: -

Multibinder<Action> actionBinder = Multibinder.newSetBinder(binder(), Action.class); 

actionBinder.addBinding().to(FooAction.class); 
actionBinder.addBinding().to(BarAction.class); 

但是,這將是很好,如果我能寫會被自動拾取並注入到我的列表新的動作類? 還是這只是一廂情願的想法。

回答

1

Java不知道所有可用的實現。你將不得不循環遍歷類路徑中的所有類並檢查它們(參見Find Java classes implementing an interface),另一個選項是通過已知位置的配置文件告知Guice或Spring(這是插件經常工作的方式)。

+0

我知道java dosnt知道這個,但是有一個Guice或Spring註釋會導致Guice綁定器在我運行時爲我填充(畢竟它可以做到,如果它不是列表),而不是我很難通過調用'addBinding()'來編碼它? – 2012-03-27 14:57:25

+0

Guice中沒有註釋。你必須自己寫。如上所述,Java不知道,所以你將不得不掃描類路徑。 – 2012-03-27 15:00:34

2

由於mlk避而遠之,您正在尋找一個類路徑掃描器。我們使用感言:

http://code.google.com/p/reflections/

你可能會想看看他們的「getSubTypesOf」的方法。我們使用它以及它們的「getTypesAnnotatedWith」方法在啓動時廣泛查找某種特定類的所有類,以便它們可以在啓動時綁定到列表。