Почему в Spring XML-конфигурация загружается раньше Java-based конфигурации?

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

Ответ

В Spring порядок загрузки конфигураций определяется их приоритетом и историческим контекстом. XML загружается первым, чтобы Java/Annotation-based конфигурация могла его переопределить.

Основные причины:

  1. Исторический порядок: Spring начинался с XML. Конфигурация через ClassPathXmlApplicationContext обрабатывает XML до сканирования аннотаций.
  2. Принцип переопределения: Более высокоуровневая (аннотационная) конфигурация имеет приоритет над низкоуровневой (XML). Это позволяет задать базовые бины в XML и точечно менять их в @Configuration-классах.

Пример:

<!-- applicationContext.xml -->
<bean id="myService" class="com.example.DefaultService"/>
@Configuration
public class AppConfig {
    @Bean
    public Service myService() {
        // Этот бин переопределит бин из XML
        return new CustomServiceImpl();
    }
}

Важно: Это поведение по умолчанию. Порядок можно контролировать с помощью @Import, @ImportResource и порядка объявления конфигурационных классов.