Как поменять реализации для каждого пользователя в веб-приложении с помощью Spring's DI - PullRequest
2 голосов
/ 10 февраля 2010

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

Существует интерфейс, которого придерживаются все реализации.

Я хочу знать, существует ли шаблон, в котором можно было бы просто добавить новые реализации в папку развертывания (файл .jar), не перекомпилируя приложение. Самое большее, вам нужно будет зайти в раздел администрирования и ввести некоторые подробности о внедрении новой кредитной карты.

Пример. Допустим, в данный момент приложение поддерживает Authorize.net. Так что все пользователи используют authorize.net. Теперь я пишу новую реализацию и удаляю файл .jar, захожу в администратор и регистрирую нового поставщика кредитных карт.

Теперь пользователи могут войти в систему и выбрать новую реализацию.

Возможно ли это сделать без перекомпиляции? Может ли DI весны пригодиться для этого?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

То, что вы описываете, звучит более подходящим для OSGi, чем "основной" механизм контейнера Spring bean. Обычно Spring ApplicationContext не изменяется, когда приложение запущено и работает. Напротив, OSGi разработан для такого динамического поведения во время выполнения и может использоваться вместе с Spring. Взгляните на документацию Spring Dynamic Modules , чтобы понять, как это работает.

2 голосов
/ 10 февраля 2010

Я предлагаю вам взглянуть на java.util.ServiceLoader, что позволяет вам выполнить поиск реализаций интерфейса, которые динамически добавляются в путь к классам во время выполнения. По сути, jar службы должен просто содержать текстовый файл с именем /META-INF/services/some.package.InterfaceName, который содержит список классов, которые реализуют указанный интерфейс.

Однако не существует стандартного способа расширения пути к классу запущенного веб-приложения (как в веб-приложении J2EE), поэтому в зависимости от контейнера сервлета вам может потребоваться перезапустить веб-приложение после добавления новых jar-файлов в каталог развертывания.

0 голосов
/ 10 февраля 2010

@ Rob H предлагает хороший вариант с OSGi, поскольку он изначально поддерживает то, что вы хотите сделать.

Другой вариант, который не будет вводить новую технологию, - это делегировать способы оплаты другим приложениям Java EE, которые затем можно запускать, добавлять или обновлять независимо от центрального механизма обработки платежей. Администратор может легко сопоставить новый способ оплаты с соответствующим приложением.

...