Конфигурация компонентов (через XML, Java и аннотации)
XML-конфигурация: Исторически первый способ настройки Spring-приложений. Разработчик описывает бины (классы и их зависимости) в одном или нескольких XML-файлах. Каждый <bean> в XML определяет ссылку на класс и задает свойства/конструкторы для внедрения зависимостей. XML-конфигурация явная и наглядная, но может быть громоздкой при большом количестве бинов.
Java-конфигурация (Java-based): Современный подход, при котором конфигурация пишется на языке Java с использованием специальных классов. Класс помечается @Configuration, а методы внутри него, создающие и возвращающие объекты, помечаются @Bean – каждый такой метод регистрирует бин в контексте. Java-конфигурация типобезопасна (IDE поможет с рефакторингом), позволяет использовать всю мощь языка (условия, циклы) для настройки. С Spring Boot большинство настроек производится именно в виде Java-конфига или через аннотации.
Аннотации и сканирование компонентов: В этом варианте сами классы компонентов помечаются аннотациями стереотипами (@Component, @Service, @Repository, @Controller и др.), а Spring автоматически обнаруживает их при сканировании classpath. Зависимости между ними выражаются тоже аннотациями (@Autowired, @Inject, или через конструктор с единственным параметром). Достаточно включить компонент-сканирование (например, аннотация @ComponentScan над конфигурационным классом, либо использование @SpringBootApplication в Spring Boot) – и все помеченные классы будут зарегистрированы как бины. Этот подход минимизирует вручную написанную конфигурацию, следуя принципу "конвенция важнее конфигурации".
Пояснение:
Spring поддерживает несколько стилей конфигурации, и их можно комбинировать в одном приложении. Рассмотрим подробнее каждый из них:
XML-конфигурация
В файле XML вы объявляете каждый бин и его связи. Например, конфигурация:
<!-- applicationContext.xml -->
<beans>
<!-- Определяем бин Repository -->
<bean id="repository" class="com.example.Repository"/>
<!-- Определяем бин Service с внедрением repository -->
<bean id="service" class="com.example.Service">
<!-- Внедрение зависимости repository через сеттер setRepository -->
<property name="repository" ref="repository"/>
</bean>
</beans>
Здесь описаны два бина: Service и Repository. У бина service указано свойство repository, ссылающееся на бин с id "repository". При старте контейнер Spring прочитает этот XML: создаст объект Repository, затем создаст объект Service и вызовет у него метод setRepository, передав ссылку на ранее созданный Repository. В XML можно настраивать и более сложные вещи: конструкторы с параметрами (<constructor-arg>), различные scope бинов (через атрибут scope, например prototype/singleton), а также подключать дополнительные XML-модули namespace для упрощенной конфигурации (например, <context:component-scan> для включения сканирования аннотаций, <jdbc:...> для настроек JDBC и пр.).
Недостатки XML: когда конфигурация разрастается, файлы XML становятся длинными, их сложнее поддерживать. К тому же, строки в XML не проверяются компилятором на корректность ссылок или типов. Поэтому с появлением Java-базированной конфигурации большинство проектов постепенно отказались от обширных XML в пользу кода.
Однако, XML по-прежнему поддерживается и иногда применяется, например, для подключаемых модулей или библиотек (они могут поставляться с XML-конфигами, которые просто импортируются в ваше приложение) или в очень старых проектах. В небольших Spring Boot приложениях XML практически не нужен – вся конфигурация делается кодом и аннотациями.