Внедрение в список с помощью Guice (или Spring) - PullRequest
2 голосов
/ 27 марта 2012

У меня есть список действий, реализующих интерфейс 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 ]

2 голосов
/ 27 марта 2012

Поскольку млк ускользает от вас, вы ищете сканер classpath.Мы используем отражения:

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

Возможно, вы захотите взглянуть на их метод "getSubTypesOf".Мы используем это, а также их метод "getTypesAnnotatedWith", чтобы найти все классы определенного типа при запуске, чтобы они могли быть связаны со списками при запуске.

1 голос
/ 27 марта 2012

Java не знает всех доступных реализаций. Вам нужно было бы перебрать все классы в пути к классам и проверить их (см. Найти классы Java, реализующие интерфейс ), другой вариант - сообщить Guice или Spring через файлы конфигурации в известных местах (это как плагины часто работают).

...