Я работаю с очень большими приложениями JSF/Facelets, которые используют Spring для управления DI/bean. Мои приложения имеют модульную структуру, и в настоящее время я ищу подходы к стандартизации модуляции.
Моя цель - составить веб-приложение из нескольких модулей (возможно, в зависимости от друг друга). Каждый модуль может содержать следующее:
- Классы;
- Статические ресурсы (изображения, CSS, скрипты);
- Шаблоны Facelet;
- Управляемые beans - Spring контексты приложения с запросом, сеансом и областью beans (альтернатива - управляемая JSF beans);
- Servlet API - сервлеты, фильтры, прослушиватели (это необязательно).
То, что я хотел бы избежать (почти любой ценой), - это необходимость скопировать или извлечь ресурсы модуля (например, шаблоны Facelets) в WAR или расширить web.xml
для сервлетов, фильтров и т.д. Это необходимо достаточно добавить модуль (JAR, bundle, artifact,...) в веб-приложение (WEB-INF/lib
, bundles
, plugins
,...), чтобы расширить веб-приложение с помощью этого модуля.
В настоящее время я решаю эту задачу с помощью специального решения для модуляции, которое основано на использовании ресурсов classpath:
- Сервлет специальных ресурсов обслуживает статические ресурсы из ресурсов класса (JAR).
- Специальный ресивер ресурса Facelets позволяет загружать шаблоны Facelet из ресурсов pathpath.
- Spring загружает контексты приложений с помощью шаблона
classpath*:com/acme/foo/module/applicationContext.xml
- это загружает контексты приложений, определенные в JAR модуля. - Наконец, пара делегирующих сервлетов и фильтров делегирует обработку запросов сервлетам и фильтрам, сконфигурированным в контекстах приложений Spring из модулей.
В последние дни я много читал о OSGi, и я рассматривал, как (и если) я мог бы использовать OSGi в качестве стандартизованного подхода модуляции. Я думал о том, как отдельные задачи могут быть решены с помощью OSGi:
- Статические ресурсы - пакеты OSGi, которые хотят экспортировать статические ресурсы, регистрируют экземпляры
ResourceLoader
с контекстом связки. ЦентральныйResourceServlet
использует эти загрузчики ресурсов для загрузки ресурсов из пакетов. - Шаблоны Facelet - аналогично выше, центральная
ResourceResolver
использует сервисы, зарегистрированные пакетами. - Управляемый beans - Я понятия не имею, как использовать выражение типа
#{myBean.property}
, еслиmyBean
определено в одном из пакетов. - API-интерфейс Servlet - используйте что-то вроде WebExtender/Pax Web для регистрации сервлетов, фильтров и т.д.
Мои вопросы:
- Я изобретаю велосипед здесь? Существуют ли для этого стандартные решения? Я нашел упоминание Spring Slices, но не смог найти много документации об этом.
- Как вы думаете, OSGi - это правильная технология для описанной задачи?
- Является ли мой эскиз приложения OSGI более или менее правильным?
- Как следует обрабатывать beans (особенно область запроса/сеанса)?
Буду благодарен за ваши комментарии.