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

Что в себе содержит @SpringBootApplication

2.0 Middle🔥 181 комментариев
#Тестирование

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

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

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

Что в себе содержит @SpringBootApplication

Аннотация @SpringBootApplication — это мета-аннотация, которая комбинирует три важные аннотации в одну. Она автоматизирует начальную конфигурацию Spring приложения и является стандартным способом для запуска Spring Boot приложений.

Состав @SpringBootApplication

Под капотом эта аннотация — это комбинация трёх аннотаций:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { 
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) 
})
public @interface SpringBootApplication {
    // ...
}

1. @SpringBootConfiguration

Это специализированная версия @Configuration для Spring Boot:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// Эквивалентно:
@Configuration
public class Application {
    // ...
}

Что это делает:

  • Указывает Spring, что класс содержит конфигурацию приложения
  • Позволяет определять @Bean методы для регистрации компонентов
  • Делает класс основным источником конфигурации

Пример с @Bean:

@SpringBootApplication
public class Application {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. @EnableAutoConfiguration

Это сердце Spring Boot. Она включает автоматическую конфигурацию на основе classpath зависимостей:

@EnableAutoConfiguration
public class Application {
    // Автоматически настроит:
    // - DataSource, если видит spring-boot-starter-data-jpa
    // - EmbeddedServletContainer, если видит spring-boot-starter-web
    // - Jackson, если видит jackson-core
    // - и многое другое
}

Как это работает:

Spring Boot сканирует файл META-INF/spring.factories (или META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports в Spring Boot 2.7+) в зависимостях и загружает AutoConfiguration классы:

# spring-boot-autoconfigure/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration

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

@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        return DataSourceBuilder.create()
            .url(properties.getUrl())
            .username(properties.getUsername())
            .password(properties.getPassword())
            .driverClassName(properties.getDriverClassName())
            .build();
    }
}

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

Если вам не нужна какая-то автоконфигурация, можно её отключить:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// Или через properties:
// spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

3. @ComponentScan

Эта аннотация указывает Spring искать компоненты (бины) в определённых пакетах:

@SpringBootApplication
// По умолчанию эквивалентно:
// @ComponentScan(basePackages = "com.example.myapp")
public class Application {
    // ComponentScan сканирует текущий пакет и все подпакеты
}

Что она сканирует:

  • @Component аннотированные классы
  • @Service, @Repository, @Controller (подтипы @Component)
  • @Configuration классы
  • @Bean методы

Пример:

package com.example.myapp;

@SpringBootApplication // Сканирует com.example.myapp и подпакеты
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

package com.example.myapp.service;

@Service
public class UserService {
    // Будет автоматически обнаружен
}

package com.example.myapp.controller;

@RestController
public class UserController {
    // Будет автоматически обнаружен
}

package com.external.module; // За пределами scan пакета

@Component
public class ExternalComponent {
    // НЕ будет обнаружен автоматически
}

Указание пользовательского базового пакета:

@SpringBootApplication(scanBasePackages = "com.example")
public class Application {
    // Сканирует com.example и все подпакеты
}

// Или несколько пакетов:
@SpringBootApplication(scanBasePackages = {"com.example", "com.external"})
public class Application {
    // Сканирует оба пакета
}

Полный пример использования

@SpringBootApplication(
    scanBasePackages = "com.mycompany",
    exclude = DataSourceAutoConfiguration.class
)
public class Application {
    
    // Определение своих бинов
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    // Дополнительная конфигурация
    @Bean
    public WebClient webClient() {
        return WebClient.builder().build();
    }
    
    // Точка входа
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Порядок инициализации

Когда вы запускаете приложение, происходит следующее:

  1. SpringApplication.run() — создаёт ApplicationContext
  2. @ComponentScan — находит и регистрирует все компоненты в пакетах
  3. @EnableAutoConfiguration — загружает автоконфигурации на основе classpath
  4. Разрешение зависимостей — внедряет зависимости через DI контейнер
  5. @Bean методы — создаёт дополнительные бины
  6. Lifecycle callbacks — вызывает @PostConstruct методы

Различия от классической Spring конфигурации

ЧтоSpringSpring Boot
Конфигурация DataSourceXML или @ConfigurationАвтоматическая из properties
ЗависимостиУказываются вручнуюAuto-configured
Вложенный серверТребует внешнего TomcatВстроенный Tomcat
starter зависимостиНетЕсть (spring-boot-starter-web и т.д.)

Лучшие практики

  1. Размещайте Application класс в корневом пакете — это облегчает @ComponentScan
  2. Используйте @SpringBootApplication вместо комбинации аннотаций — это более читаемо
  3. Переопределяйте конфигурацию через application.properties — не через код
  4. Исключайте только необходимые автоконфигурации — избегайте излишних exclude
  5. Определяйте @Bean методы в Application классе или @Configuration классах — не в обычных компонентах

Таким образом, @SpringBootApplication — это мощная аннотация, которая объединяет основные возможности Spring Boot: конфигурацию, автоматическую настройку и сканирование компонентов в одной строке кода.