Конфигурация среды для веб-приложения на основе Spring? - PullRequest
15 голосов
/ 09 июня 2011

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

Ответы [ 4 ]

24 голосов
/ 09 июня 2011

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

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

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 для получения дополнительной информации о том, как загрузить значения свойств.

10 голосов
/ 09 июня 2011

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

Тем временем я лично делаю именно то, что описал Павел.

0 голосов
/ 09 июня 2011

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

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

В Spring 3.1 также появились новые методы, позволяющие «правильно» выполнять подобные действия со сменными файлами свойств.Загляните в унифицированный блог по управлению имуществом .Подробнее об объявлении о выпуске m1 .

0 голосов
/ 09 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...