Конфигурация для конкретной среды для веб-приложения на основе Spring?

Как узнать среду развертывания веб-приложения, например. будь то локальный, dev, qa или prod и т.д. Есть ли способ определить это в spring контексте контекста приложения во время выполнения?

Ответы

Ответ 1

Не добавляйте логику в свой код, чтобы проверить, в какой среде вы работаете, - это рецепт катастрофы (или, по крайней мере, сжигание много полуночного масла по дороге).

Вы используете Spring, поэтому воспользуйтесь этим. Используйте инъекцию зависимостей, чтобы обеспечить параметры, специфичные для вашей среды. Например. если вам нужно вызвать веб-службу с различными конечными точками в тесте и производстве, сделайте что-то вроде этого:

public class ServiceFacade {
    private String endpoint;

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public void doStuffWithWebService() {
        // use the value of endpoint to construct client
    }
}

Затем используйте Spring PropertyPlaceholderConfigurer (или, альтернативно, PropertyOverrideConfigurer), чтобы заполнить это свойство либо из файла .properties, либо из системного свойства JVM, например:

<bean id="serviceFacade" class="ServiceFacade">
    <property name="endpoint" value="${env.endpoint}"/>
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:environment.properties</value>
    </property>
</bean>

Теперь создайте два (или три или четыре) файла, например: по одному для каждой из разных сред.

В environment-dev.properties:

env.endpoint=http://dev-server:8080/

В environment-test.properties:

env.endpoint=http://test-server:8080/

Теперь возьмите соответствующий файл свойств для каждой среды, переименуйте его только в environment.properties и скопируйте его в каталог lib сервера приложений или где-нибудь еще, где он появится в вашем пути к классу приложений. Например. для Tomcat:

cp environment-dev.properties $CATALINA_HOME/lib/environment.properties

Теперь развертывание вашего приложения - Spring заменит значение "http://dev-server: 8080/", когда оно установит ваше свойство конечной точки во время выполнения.

Подробнее о загрузке значений свойств см. в документах Spring.

Ответ 2

Стоит отметить, что Spring 3.1 M1 представила поддержку профилей. Скорее всего, это будет окончательный ответ на эту потребность. Поэтому следите за этим.

Между тем, я лично делаю то, что описал Павел.

Ответ 3

Мы делаем это в нашем приложении, но не в конфигурации spring.

Во время запуска приложения (в прослушивателе контекста) мы читаем имя машинного узла и сохраняем соответствующий файл prod, dev, qa в статической переменной.

Мы не получаем доступ к переменной напрямую (хотя можно), но у нас есть служба spring, которая взаимодействует с этой переменной, чтобы предоставить нам доступ к нашей информации о серверной среде.

Ответ 4

Один из способов - посмотреть на метод System.getProperty(key), который является чистым java. Однако это, вероятно, не очень хорошая идея, так как вы не должны действительно делать такую ​​логику среды в своем приложении.

Другим методом будет конфигурация сервера (настройте другой файл контекста приложения для каждого сервера среды).

Spring 3.1 также привносит новые методы, чтобы делать это "правильно" со сменными файлами свойств. Вы должны взглянуть на единый блог управления имуществом. Более подробно в объявление о выпуске m1.