Какие способы конфигурации приложений поддерживает Spring Framework?

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

Ответ

Spring предлагает несколько стратегий конфигурации, которые можно комбинировать:

  1. XML-конфигурация (Legacy/Classic).

    • Определение бинов и их зависимостей в файлах applicationContext.xml.
      <bean id="myService" class="com.example.MyServiceImpl">
      <property name="repository" ref="myRepository"/>
      </bean>
  2. Конфигурация на аннотациях (Annotation-based).

    • Использование стереотипных аннотаций (@Component, @Service, @Repository, @Controller) для автоматического обнаружения бинов и @Autowired для внедрения.
      @Service
      public class MyService {
      @Autowired
      private MyRepository repository;
      }
  3. Java-based конфигурация (Предпочтительный современный способ).

    • Использование классов, помеченных @Configuration, где бины определяются методами с аннотацией @Bean. Позволяет сохранить преимущества типобезопасности и рефакторинга.
      @Configuration
      public class AppConfig {
      @Bean
      public DataSource dataSource() {
          return new HikariDataSource();
      }
      @Bean
      public MyService myService(DataSource dataSource) {
          return new MyService(dataSource); // Constructor Injection
      }
      }
  4. Конфигурация на свойствах (Properties/YAML) с Spring Boot.

    • Внешняя конфигурация через файлы application.properties или application.yml. Управляется аннотацией @ConfigurationProperties.
      # application.yml
      spring:
      datasource:
      url: jdbc:postgresql://localhost/mydb
      username: admin
  5. Профили (Profiles).

    • Позволяют определять условные бины и конфигурации для разных сред (dev, test, prod) с помощью @Profile("dev").

Эволюция: Современные приложения, особенно на Spring Boot, используют комбинацию Java-based конфигурации и конфигурации на свойствах, полностью избегая XML.