← Назад к вопросам

Как отреагирует Spring Boot, если в Starter объявить автоконфигурацию

2.2 Middle🔥 111 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Spring Boot автоконфигурация в Starter библиотеке

Это вопрос о том, как работает механизм auto-configuration в Spring Boot и как он интегрируется со Starter библиотеками.

Краткий ответ

Spring Boot автоматически обнаружит и применит автоконфигурацию из Starter-а, если она правильно объявлена в spring.factories (или spring/factories в Spring Boot 3.x+).


Как это работает: Step-by-Step

Шаг 1: Структура Starter библиотеки

my-custom-starter/
├── pom.xml
├── src/main/java/
│   └── com/example/starter/
│       └── MyAutoConfiguration.java
└── src/main/resources/
    └── META-INF/
        └── spring/
            └── org.springframework.boot.autoconfigure.AutoConfiguration.imports

Шаг 2: Объявляем автоконфигурацию

Spring Boot 2.x (properties файл):

# src/main/resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.starter.MyAutoConfiguration,\
  com.example.starter.AnotherConfiguration

Spring Boot 3.x+ (imports файл — рекомендуется):

# src/main/resources/META-INF/spring/
# org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.starter.MyAutoConfiguration
com.example.starter.AnotherConfiguration

Шаг 3: Пишем саму конфигурацию

@AutoConfiguration
@ConditionalOnClass(HttpClient.class)  // только если на classpath
@ConditionalOnMissingBean(HttpClient.class)  // если не определён вручную
public class MyAutoConfiguration {

  @Bean
  public HttpClient httpClient() {
    System.out.println("HttpClient bean создан автоконфигурацией!");
    return new HttpClient();
  }

  @Bean
  @ConditionalOnProperty(
    name = "my.feature.enabled",
    havingValue = "true",
    matchIfMissing = false
  )
  public FeatureService featureService() {
    return new FeatureService();
  }
}

Как Spring Boot реагирует при загрузке

1. Сканирование классов (Bootstrap)

При запуске Spring Boot:

  1. Сканирует META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  2. Находит все классы, перечисленные там
  3. Загружает их как обычные @Configuration классы

2. Применение условий (@Conditional)

Для каждой автоконфигурации проверяются условия:

@ConditionalOnClass(SomeClass.class)        // есть ли класс на classpath?
@ConditionalOnMissingBean                   // не определён ли уже бин?
@ConditionalOnProperty                      // включена ли свойством?
@ConditionalOnWebApplication                // это веб-приложение?
@ConditionalOnExpression                    // SpEL выражение

Если условия не выполнены → конфигурация пропускается, бины не создаются.

3. Порядок загрузки (AutoConfigureOrder)

Можно контролировать порядок:

@AutoConfiguration
@AutoConfigureBefore(WebMvcAutoConfiguration.class)  // загрузить раньше
public class FirstAutoConfiguration { }

@AutoConfiguration
@AutoConfigureAfter(FirstAutoConfiguration.class)    // загрузить позже
public class SecondAutoConfiguration { }

Без явного порядка Spring использует @Order (по умолчанию 0).


Пример: полный цикл

my-http-starter/pom.xml:

<groupId>com.example</groupId>
<artifactId>my-http-starter</artifactId>
<version>1.0.0</version>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
  </dependency>
</dependencies>

MyHttpAutoConfiguration.java:

@AutoConfiguration
@ConditionalOnClass(HttpClient.class)
@EnableConfigurationProperties(HttpClientProperties.class)
public class MyHttpAutoConfiguration {

  private final HttpClientProperties properties;

  public MyHttpAutoConfiguration(HttpClientProperties properties) {
    this.properties = properties;
  }

  @Bean
  @ConditionalOnMissingBean
  public HttpClient httpClient() {
    return HttpClients.custom()
      .setConnectTimeout(properties.getConnectTimeout())
      .setMaxConnTotal(properties.getMaxConnections())
      .build();
  }

  @Bean
  public HttpClientMetrics httpClientMetrics() {
    System.out.println("HttpClient auto-configured!");
    return new HttpClientMetrics();
  }
}

HttpClientProperties.java:

@ConfigurationProperties(prefix = "app.http")
public class HttpClientProperties {
  private int connectTimeout = 5000;
  private int maxConnections = 100;
  
  // getters/setters
}

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:

com.example.starter.MyHttpAutoConfiguration

application.yml (в приложении, использующем стартер):

app:
  http:
    connect-timeout: 10000
    max-connections: 200

Результат

При запуске приложения:

  1. Spring Boot находит файл imports
  2. Загружает MyHttpAutoConfiguration
  3. Проверяет условие: HttpClient на classpath? Да ✓
  4. Создаёт бин HttpClient с настройками из properties
  5. Выводит: "HttpClient auto-configured!"
  6. HttpClient готов к использованию в приложении!
@RestController
public class MyController {
  
  @Autowired
  private HttpClient httpClient;  // автоматически введён!
  
  @GetMapping("/test")
  public String test() {
    // используем httpClient
    return "OK";
  }
}

Частые ошибки

❌ Забыли добавить в imports:

# Ничего не произойдёт, конфигурация не загрузится!

✅ Правильно:

com.example.MyAutoConfiguration

Отключение автоконфигурации

Приложение может отключить её:

# application.properties
spring.autoconfigure.exclude=com.example.starter.MyAutoConfiguration

Или через Java:

@SpringBootApplication(exclude = {MyAutoConfiguration.class})
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

Итог

Если в Starter правильно объявить автоконфигурацию:

  • Spring Boot автоматически её найдёт через механизм SPI (Service Provider Interface)
  • Применит условия и создаст бины
  • Приложение получит готовые бины без дополнительной конфигурации
  • Пользователь сможет отключить через properties, если нужно

Это мощный механизм для создания переиспользуемых библиотек!