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

«В какой среде развертывания Spring-приложения может потребоваться изменение XML-конфигурации без перекомпиляции кода?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Такая необходимость возникает при развертывании приложения в виде WAR-архива на сервере приложений (Apache Tomcat, Jetty, WildFly, WebLogic) или в контейнере сервлетов.

Почему именно там:

  • Архив (WAR) представляет собой собранный и скомпилированный код.
  • Конфигурационные XML-файлы (например, WEB-INF/web.xml, WEB-INF/applicationContext.xml) упакованы внутри архива и могут быть извлечены, отредактированы, и контекст приложения перезапущен без повторной сборки всего проекта.

Типичные конфигурационные файлы для "горячего" изменения:

  • web.xml — дескриптор развертывания веб-приложения.
  • applicationContext.xml — конфигурация бинов Spring.
  • persistence.xml — настройки JPA (поставщик, свойства Hibernate).
  • *-servlet.xml — конфигурация DispatcherServlet в Spring MVC.

Пример: Изменение строки подключения к БД в applicationContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="url" value="jdbc:postgresql://OLD_HOST:5432/db"/>
    <!-- Меняем значение на новое без перекомпиляции -->
    <property name="url" value="jdbc:postgresql://NEW_HOST:5432/db"/>
</bean>

Как внедрять изменения: Значения часто выносят в property-файлы или переменные окружения, которые можно менять на сервере:

<property name="url" value="${DB_URL}"/>