Java IoC: распределенная конфигурация

Я создаю приложение J2EE, в котором хочу разрешить плагины. Я вполне убежден в совершенстве инфраструктуры IoC, поэтому приложение будет иметь ее для управления службами.

Теперь я хочу разрешить добавление плагинов в виде простого JAR, добавленного в путь к классам +, возможно, простой файл конфигурации для редактирования, чтобы активировать их, никоим образом не похожий на файлы конфигурации Spring XML.

Большая часть архитектуры плагинов будет основываться на шаблонах стратегия/конвейер/цепочка команд: например, лучший плагин для действия выбирается по стратегии, несколько плагинов добавляют фильтрующие действия к пользовательскому вводу благодаря конвейеру и так далее.

Итак, я хочу иметь возможность:

  • определить сервисные интерфейсы в основном приложении,
  • настроить базовую реализацию для расширяемых сервисов с выбранным шаблоном в основном приложении,
  • пусть сторонние плагины регистрируются в этих хуках.

Первые 2 пункта довольно просты, с IoC или без. Последнее кажется более сложным без поддержки на уровне контейнера IoC, или, по крайней мере, есть много подводных работ (как управлять обнаружением путей к классам/сервисам, как управлять сервисными заказами в конвейере, когда изменение контекста (новые плагины), как управлять переопределением службы и т. д.).

Я знаю, что Tapestry5 хорош в этом отношении[1], но я не могу найти ничего действительно подходящего для Spring и Guice. И моя компания больше String/Guice, чем T5 (ну, если я смогу показать, что это лучшее решение...)

Поэтому мне интересно:

  • если я пропустил какую-то очевидную документацию;
  • если мои требования такие особенные;
  • если контейнер IoC не подходит для этого, и я должен искать OSGi или что-то еще.

Спасибо за любые советы!

[1] http://tapestry.apache.org/tapestry5.1/tapestry-ioc/configuration.html


person fanf42    schedule 31.08.2010    source источник


Ответы (3)


Я не уверен, как это будет работать с тем, что вы хотите сделать, но основная механика Guice для работы с плагинами такова: Multibindings. То, как вы справляетесь с обнаружением плагинов, зависит от вас, но есть множество вариантов, включая сканирование пути к классам для реализации интерфейсов плагинов, наличие плагинов, предоставляющих Module, которые добавляют их реализацию (и) в мультибиндер (ы), используя конфигурацию файл, в котором перечислены классы реализации плагинов и т. д.

Как упоминается в ссылке, вам понадобится OSGi, если вам нужно, чтобы плагины можно было добавлять во время выполнения без перезапуска.

person ColinD    schedule 31.08.2010
comment
О, отлично, я думаю, это было именно то, что я искал и не нашел. Значит, есть только Весна, вождь, который как не такой? Спасибо ! - person fanf42; 01.09.2010

Рассматривали ли вы возможность взглянуть на решение Java EE 6 — CDI, реализация называется Weld на основе JBoss Seam — может оказаться полезным?

person Thorbjørn Ravn Andersen    schedule 31.08.2010

Как только вы начнете вставлять jar-файлы и их зависимости, а затем пройдете пару итераций этого с разными плагинами и разными версиями зависимостей, вы начнете чувствовать боль, которой поддаются многие «контейнеры хоста приложений».
Один из возможных вариантов. Решением этой проблемы является OSGi, хотя я заметил блог Tapestry, в котором освещаются подводные камни подхода OSGi:
http://blog.tapestry5.de/index.php/2010/01/19/tapestry-ioc-modularization-of-web-applications-without-osgi/

person crowne    schedule 31.08.2010
comment
Я бы попытался избежать OSGi, который действительно сложен и низкоуровневый для того, что мне нужно, в частности, без загрузки плагинов во время выполнения. В статье четко изложены преимущества T5 IoC в этом отношении. Тем не менее, я буду помнить, что когда-нибудь в будущем OSGi будет простым и продуктивным решением. - person fanf42; 01.09.2010