用Guice(或Spring)注入列表

时间:2012-03-27 07:31:59

标签: dependencies guice code-injection

我有一个实现Action接口的操作列表。

FooAction implements Action
BarAction implements Action

我希望能够处理列表中的每个操作: -

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

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

是否有可能让Guice(或春天!)将所有单独的动作注入动作列表? 我知道我可以编写代码来手动创建一个这样的集合: -

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

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

但如果我能编写自动拾取并注入我的列表的新动作类,那会很好吗? 或者这只是一厢情愿的想法。

2 个答案:

答案 0 :(得分:2)

正如mlk所说,你正在寻找一个类路径扫描器。我们使用反思:

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

您可能希望查看其“getSubTypesOf”方法。我们广泛使用它以及它们的“getTypesAnnotatedWith”方法在启动时查找某种风格的所有类,以便它们可以在启动时绑定到列表。

答案 1 :(得分:1)

Java并不知道所有可用的实现。您必须遍历类路径中的所有类并检查它们(请参阅Find Java classes implementing an interface),另一个选项是通过已知位置的配置文件通知Guice或Spring(这是插件经常工作的方式)。