2014-03-05 2 views
1

Я разработчик, работающий над веб-приложением Java, которое построено на основе Spring. Это приложение будет развернуто для нескольких разных клиентов. Существует класс, который содержит некоторую бизнес-логику, которая отличается для каждого клиента. С точки зрения Spring, достаточно просто подключить в соответствующем классе (как bean) для каждого клиента.Как настроить приложение для бизнес-логики Spring?

Однако разработчики не несут ответственности за развертывание приложения. Команда Operations отвечает за то, что они открывают файл WAR и изменяют конфигурацию Spring конфигурации для каждого развертывания клиента, вероятно, слишком много, чтобы спросить у них. Файлы свойств в порядке, но изменение внутренних файлов - возможно, нет.

Есть ли у кого-нибудь еще стратегия для решения этой проблемы?

Edit:

Чтобы дать пример того, что я говорю о:

public interface IEngine { 
    void makeNoise(); 
} 

public class Car { 
    public void setEngine(IEngine engine) { 
    this.engine = engine; 
    } 
} 

бизнес-логики клиенту по:

HeavyDutyEngine implements IEngine { 
    public void makeNoise() { 
    System.out.println("VROOOM!"); 
    } 
} 

бизнес-логика Customer Б:

LightWeightEngine implements IEngine { 
    public void makeNoise() { 
    System.out.println("putputput"); 
    } 
} 

В XML-конфигурации Spring:

Для клиента А, может выглядеть следующим образом:

<bean id="hdEngine" class="HeavyDutyEngine" /> 
<bean id="lwEngine" class="LightWeightEngine" /> 

<bean id="car" class="Car"> 
    <property name="engine" ref="hdDngine"> 
</bean> 

Для клиента B, это может выглядеть следующим образом:

<bean id="hdEngine" class="HeavyDutyEngine" /> 
<bean id="lwEngine" class="LightWeightEngine" /> 

<bean id="car" class="Car"> 
    <property name="engine" ref="lwEngine"> 
</bean> 
+0

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

+0

В основном это просто замена определенных фасолей в зависимости от клиента. –

ответ

1

Чтобы настроить Spring для разных сред, вы можете использовать концепцию Spring «profiles». (введено весной 3.1)

У вас есть разные способы включить или отключить эти свойства. Например, параметр свойств java. Но поскольку вы используете WAR и, следовательно, некоторый контейнер Servlet, я бы рекомендовал поместить эту конфигурацию в контейнер Servlet.

В коту, например, вы можете поместить эту строку в context.xml (глобальный или специализированный), чтобы профиль

<Parameter name="spring.profiles.active" value="myProfile"/> 
+0

Спасибо, я ищу функцию профиля Spring. –

0

Вы можете переместить некоторую конфигурацию БД , если вы используете его.

И вы можете использовать что-то вроде этого

ref="{ref-name}" 

ref-name, где могут быть решены с помощью свойства файла (по умолчанию), настроив PropertyPlaceholderConfigurer.

Или вы можете написать свою собственную упаковку поверх PropertyPlaceholderConfigurer, которая примет значения из таблицы DB, которая является внешней по отношению к вашему развертываемому файлу WAR.

В одном из моих проектов мы использовали этот метод для разрешения пользовательских зависимостей. Обертка, которая ищет БД, используемую для получения первого приоритета, и если у БД нет пары ключ/значение, тогда файл свойств (в комплекте с WAR) использовался для разрешения зависимостей.

Это также позволит вам изменить какое-то значение извне из базы данных, однако с помощью IBM Websphere нам необходимо переработать сервер для изменений.

Смежные вопросы