Какова роль аннотации @ComponentScan в Spring?

Ответ

@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, то они все вместе, как мартышлюшки, будут светить своими фонариками, собирая общую картину. Главное — не напороться на один и тот же бин дважды, а то будет конфликт, пиздец.

Короче, инструмент мощный, но если бездумно светить фонариком везде, можно такое насобирать в контекст, что потом разгребать будешь неделю. Волнение, блядь, чувствую, когда кто-то сканирует корневой пакет на большом проекте.