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

В чем разница между @ComponentScan и @Component?

2.0 Middle🔥 191 комментариев
#Spring Framework

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

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

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

# Разница между @ComponentScan и @Component

Основное определение

@Component и @ComponentScan — это две разные аннотации Spring Framework, которые работают на разных уровнях конфигурации приложения.

@Component

@Component — это аннотация, которая помечает класс как компонент Spring, который должен быть автоматически обнаружен и зарегистрирован в контексте приложения.

@Component
public class UserService {
    public void processUser(String name) {
        System.out.println("Processing user: " + name);
    }
}

Характеристики:

  • Применяется к отдельному классу
  • Означает, что этот класс — управляемый bean Spring
  • Spring автоматически создаёт экземпляр и регистрирует его в контексте
  • Специализированные версии: @Service, @Repository, @Controller (наследуют функциональность @Component)

@ComponentScan

@ComponentScan — это аннотация, которая инструктирует Spring сканировать определённые пакеты в поиске классов с аннотациями @Component и его специализациями.

@Configuration
@ComponentScan(basePackages = "com.example.app")
public class AppConfig {
}

Характеристики:

  • Применяется к классу конфигурации
  • Определяет, где искать компоненты (базовые пакеты)
  • Без @ComponentScan компоненты не будут обнаружены
  • Параметры: basePackages, basePackageClasses, includeFilters, excludeFilters

Взаимодействие

// 1. Конфигурация — указывает, ГДЕ искать
@Configuration
@ComponentScan(basePackages = {"com.example.services", "com.example.repositories"})
public class ApplicationConfig {
}

// 2. Сервис — отмечает ЧТО искать
@Component
public class OrderService {
    public void createOrder() {
        System.out.println("Order created");
    }
}

// 3. Репозиторий — тоже компонент
@Component
public class OrderRepository {
    public void save(Order order) {
        System.out.println("Saved");
    }
}

Пример без @ComponentScan

@Component
public class MyService {
    // Этот класс НЕ будет зарегистрирован, если Spring не сканирует его пакет
}

Практические различия

Аспект@Component@ComponentScan
НазначениеПомечает класс как beanКонфигурирует сканирование
ПрименениеК классам бизнес-логикиК классам конфигурации
УровеньНизкий (уровень класса)Высокий (уровень приложения)
ОбязателенДа (для автодетекции)Да (для включения автодетекции)

Spring Boot

В Spring Boot часто @ComponentScan уже включена в @SpringBootApplication:

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

@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration

Поэтому в Spring Boot обычно достаточно просто пометить классы @Component, и они будут найдены автоматически.

Конкретный сценарий

Если у вас структура:

com.example
  ├── config
  │   └── AppConfig.java (@Configuration @ComponentScan)
  ├── services
  │   └── UserService.java (@Component)
  └── repositories
      └── UserRepository.java (@Component)

То @ComponentScan в AppConfig сканирует com.example и её подпакеты, находит UserService и UserRepository с @Component и регистрирует их как beans.

Резюме

  • @Component = "Я — bean, управляемый Spring"
  • @ComponentScan = "Spring, ищи компоненты вот в этих пакетах"

Без @ComponentScan компоненты не будут найдены. Без @Component класс останется простым POJO.

В чем разница между @ComponentScan и @Component? | PrepBro