Может ли кастомный Spring Boot Starter работать без явной конфигурации?

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

Ответ

Да, хорошо спроектированный Spring Boot Starter должен работать без предварительной настройки, следуя принципу convention over configuration (соглашение по умолчанию).

Как это достигается:

  1. Автоконфигурация: Классы, помеченные @Configuration, настраивают бины автоматически при соблюдении условий.
  2. Условные аннотации: Использование @ConditionalOnClass, @ConditionalOnMissingBean и других для включения конфигурации только когда это необходимо.
  3. Стандартные настройки: Предоставление разумных значений по умолчанию через @ConfigurationProperties.

Пример минимальной автоконфигурации:

@Configuration
@ConditionalOnClass(MyService.class) // Конфигурируется, только если MyService в classpath
@EnableConfigurationProperties(MyProperties.class) // Подключает свойства
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean // Создает бин, только если он еще не определен пользователем
    public MyService myService() {
        return new DefaultMyService();
    }
}

Файл META-INF/spring.factories (для Spring Boot < 2.7):

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration

Для Spring Boot 2.7+ используется файл META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.

Таким образом, стартер «из коробки» предоставляет рабочую функциональность, которую пользователь может переопределить при необходимости.