В каких сценариях XML-конфигурацию Spring нужно изменять после настройки через Java-конфигурацию?

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

Ответ

XML-конфигурация может потребоваться для изменения или дополнения Java-конфигурации в следующих случаях:

  1. Интеграция со сторонними библиотеками или legacy-кодом, которые требуют объявления бинов именно в XML (например, некоторые конфигурации Spring Security или сложные AOP-срезы).
  2. Динамическое изменение конфигурации без перекомпиляции. XML-файлы можно редактировать во время выполнения (например, в WAR-архиве) и перезагружать контекст.
  3. Удобство управления внешними свойствами. Проще выносить изменяемые параметры (строки подключения, пути) в отдельный XML с поддержкой ${property} placeholder.

Пример: Переопределение Java-бина через XML для подключения внешних свойств

Java-конфигурация (AppConfig.java):

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource("jdbc:h2:mem:test");
    }
}

XML-конфигурация (override-config.xml):

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context">
    <!-- Загрузка внешних свойств -->
    <context:property-placeholder location="file:/config/db.properties"/>
    <!-- Переопределение бина dataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.user}"/>
    </bean>
</beans>

При запуске контекста с обоими конфигами, бин из XML переопределит бин из Java-конфигурации.