В настоящее время мы изучаем технические требования для новой версии приложения Java EE. Это Java EE 6, но переход на 7 - это вариант. До сих пор это было одно приложение, одно EAR, предлагающее четко определенные функции. Тем не менее, ему необходимо определить определенную функциональность очень определенным образом на основе проекта реализации и/или клиента.
Например, некоторые клиенты будут иметь очень специфические ограничения безопасности. Можно просмотреть список сообщений, обрабатываемых инфраструктурой. Для одного клиента все в порядке, если пользователи видят все, но другой клиент хотел бы показывать только определенные типы сообщений на основе группы пользователей. Это пример определения реализации контекстно-зависимым способом, адаптирующий основные функции. Другим возможным требованием является то, что некоторые клиенты захотят расширить эту функцию, добавив новые возможности. Так что расширяемая часть.
В связи с этим необходимо иметь архитектуру, которая определяет общие функции, но имеет подключаемые части, а также возможность расширения. Для некоторых аспектов я имею общее представление о том, как это можно было бы обработать. У этого вопроса есть ответ, который отлично подходит для слоя презентации, который мы будем делать в JSF 2: Как создать модульное приложение JSF 2.0?
Я менее уверен в уровне бизнес-логики, безопасности и т.д. Моя первоначальная идея состояла в том, чтобы определить интерфейсы (пару фасадов) и найти реализацию во время выполнения или время развертывания. Во многом так же, как механизм поставщика услуг. Может быть предложена реализация по умолчанию, с возможностью определения пользовательской. Это действительно похоже на решение Java SE, и мне интересно, применяю ли я только те концепции, которые мне знакомы в этом контексте, и если нет ничего лучше для EE. Я думаю, что аннотация @Alternative
служит такой цели.
Другой возможностью может быть использование перехватчиков и декораторов. Я не уверен, насколько перехватчики полезны вне протоколов, аудита и других вещей, которые не затрагивают основную бизнес-логику. Декораторы кажутся подходящими для того, чтобы позволить реализовать реализацию с помощью пользовательских функций и, возможно, также подключаемых частей.
Может ли кто-нибудь дать представление о том, какое решение лучше всего для какой части этой задачи? Должен ли я объединить эти методы для различных частей проблемной области? Есть ли возможности, которые я не вижу?
Важное требование: мы хотим сохранить код, специфичный для отдельного клиента/проекта. Мы не хотим иметь полную версию приложения под контролем версий для каждой реализации, поскольку это быстро станет кошмаром обслуживания. В идеале, также не нужно было бы строить это как монолитный EAR, но иметь возможность добавлять подключаемые части в какую-либо папку lib или разворачивать их отдельно.