Ответ
Аннотация @ComponentScan инструктирует Spring-контейнер, в каких пакетах искать классы, помеченные стереотипными аннотациями, чтобы автоматически зарегистрировать их как бины в ApplicationContext.
Какие аннотации обнаруживает @ComponentScan:
@Component@Service@Repository@Controller@Configuration(классы, помеченные этой аннотацией, также обнаруживаются)
Базовый пример:
@Configuration
@ComponentScan("com.example.app") // Сканирует пакет `com.example.app` и все его подпакеты
public class AppConfig {
}
Если пакет не указан, сканирование начинается с пакета, в котором объявлен класс с @ComponentScan.
Точная настройка области сканирования:
@Configuration
@ComponentScan(
basePackages = {"com.example.service", "com.example.repository"},
basePackageClasses = {UserService.class} // Сканирует пакет этого класса
)
public class AppConfig {
}
Фильтрация компонентов: Можно использовать атрибуты includeFilters и excludeFilters для тонкого контроля.
@ComponentScan(
basePackages = "com.example",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = {Controller.class}
) // Исключает все @Controller-классы из сканирования
)
Важно: Избыточное или слишком широкое сканирование ("com.example" вместо "com.example.service") может значительно замедлить запуск приложения. Всегда указывайте максимально конкретные пакеты.