Какой способ объявления бина имеет приоритет в Spring: XML или Java-конфигурация через @Configuration?

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

Ответ

Приоритет имеет Java-конфигурация через @Configuration. Бин, объявленный в @Configuration-классе, переопределит бин с тем же именем (id/name), объявленный в XML.

Причина: Spring применяет конфигурацию в определённом порядке, и конфигурация на основе аннотаций (включая @Configuration) обрабатывается после XML. Последнее определение выигрывает.

Пример переопределения:

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

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <!-- свойства -->
    </bean>
  2. Java-конфигурация (AppConfig.java):

    @Configuration
    public class AppConfig {
        @Bean
        public DataSource dataSource() {
            // Этот бин заменит XML-определение
            return new HikariDataSource();
        }
    }

Практическое применение: Это позволяет гибко управлять конфигурацией:

  • Использовать XML для базовой или стандартной конфигурации.
  • Переопределять специфичные бины или настройки для разных сред (dev/test/prod) с помощью @Configuration-классов.
  • Важно избегать конфликтов имён, если переопределение не является целью.