Ответ
@ComponentScan — это аннотация Spring Framework, которая указывает контейнеру, в каких пакетах искать классы-компоненты для автоматического обнаружения и регистрации в контексте приложения как Spring-бины.
Как работает:
- Сканирует указанные пакеты (по умолчанию — пакет класса конфигурации и его подпакеты).
- Обнаруживает классы, помеченные стереотипными аннотациями:
@Component,@Service,@Repository,@Controller,@Configuration. - Регистрирует найденные классы как бины в
ApplicationContext.
Пример использования:
@Configuration
@ComponentScan("com.example.service") // Сканирует только указанный пакет
public class AppConfig {
}
Ключевые возможности:
- Указание нескольких пакетов:
@ComponentScan({"com.example.service", "com.example.dao"}) - Фильтрация компонентов: Можно включать (
includeFilters) или исключать (excludeFilters) классы по аннотациям, регулярным выражениям или другим критериям. - Наследование конфигураций:
@ComponentScanможно использовать в иерархии конфигурационных классов.
Ответ 18+ 🔞
А, слушай, про эту аннотацию, @ComponentScan, ну такая, блядь, история... Представь себе, что у тебя есть огромный склад, а ты — заведующий этим складом, то есть Spring-контейнер. И тебе говорят: «Вот тут, на этих полках, лежат детали, которые надо собрать в работающую хрень». Так вот, @ComponentScan — это как раз такая бумажка с указанием, на каких именно полках искать эти детали, ёпта.
Как оно, сука, работает, если по-простому:
- Берешь фонарик (это сканер), светишь в указанные папки-пакеты. Если не указал — светишь тупо в ту папку, где сам стоишь, и во все, что под ней.
- Ищешь классы, которые помечены особыми метками:
@Component,@Service,@Repository,@Controller,@Configuration. Это как наклейки «Собери меня, я полезный». - Нашел такую наклейку — хоп, и сразу регистрируешь этот класс как бин в своем священном
ApplicationContext. Всё, теперь он часть системы, его можно куда-нибудь воткнуть.
Вот смотри, как это выглядит в коде, тут всё просто:
@Configuration
@ComponentScan("com.example.service") // Говоришь: «Свети фонариком только в эту папку, а не во все подряд, а то овердохуища всего найдёшь»
public class AppConfig {
}
А ещё у этой штуки, блядь, есть свои приколы:
- Можно несколько папок указать:
@ComponentScan({"com.example.service", "com.example.dao"})— типа, «посвети и тут, и там, я везде насовал полезного хлама». - Можно фильтровать, что брать, а что — на хуй: Есть
includeFilters(бери только это) иexcludeFilters(это вот, эту хрень, не бери ни в коем случае, она говно). Фильтровать можно по аннотациям, по названиям, по регуляркам — полный карт-бланш, блядь. - Конфигурации могут наследоваться: Если у тебя несколько классов конфигурации, и в каждом свой
@ComponentScan, то они все вместе, как мартышлюшки, будут светить своими фонариками, собирая общую картину. Главное — не напороться на один и тот же бин дважды, а то будет конфликт, пиздец.
Короче, инструмент мощный, но если бездумно светить фонариком везде, можно такое насобирать в контекст, что потом разгребать будешь неделю. Волнение, блядь, чувствую, когда кто-то сканирует корневой пакет на большом проекте.