Пожалуйста, прочитайте мой сценарий ниже и скажите мне, какой подход лучше в моем случае:
Сценарий:
- Есть интерфейс, например ConfigurationManager.
- Есть три совершенно разных его реализации. Каждый из них находится в отдельном EAR, ограниченном необходимыми библиотеками. У нас есть MemoryConfigurationManager, FileConfigurationManager и JpaConfigurationManager.
- Есть приложение (EAR). Необходимо использовать одно внедрение ConfigurationManager.
Возможно, позже разработчики создадут четвертую реализацию интерфейса и установят ее на сервер приложений, а также перенастроят основное приложение, чтобы приложение использовало новейшую реализацию интерфейса. Основное приложение всегда использует только одну реализацию интерфейса, и администраторы могут изменить конфигурацию используемой реализации.
Здесь я не могу использовать простой CDI, потому что реализации находятся в разных EAR, и приложение также находится в отдельном ухе, поэтому у них разные загрузчики классов. Простой @Inject
не работает между EAR.
Итак, у меня есть два пути:
- Если я хочу использовать CDI, мне нужно использовать метод
@Produces
. Он предоставляет способ внедрения объектов, которые не являются bean-компонентами. - Я могу использовать шаблон Service Locator. Этот вид поиска работает быстро, потому что у него есть собственный кеш.
Конечно, за методом CDI @Produces
я также могу использовать шаблон Service Locator. URL-адреса службы для различных реализаций берутся из внешнего файла конфигурации. Если кто-то создает новую реализацию ConfigurationManager и устанавливает ее в контейнер Java EE, ему необходимо поместить новый URL-адрес службы в файл конфигурации.
Так какой подход лучше? (1) или (2)? Или есть другой понятный способ реализовать этот функционал? :-)
Я предпочитаю (2).
Я думаю, что производители CDI + приносят больше ненужных классов.