Какие аннотации Spring обнаруживает @ComponentScan?

«Какие аннотации Spring обнаруживает @ComponentScan?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@ComponentScan обнаруживает не только классы, помеченные @Component, но и все стереотипные аннотации, которые сами являются мета-аннотированными @Component:

  • @Service
  • @Repository
  • @Controller
  • @Configuration
  • @RestController (комбинация @Controller и @ResponseBody)

Почему так работает? Все перечисленные аннотации имеют в своей декларации @Component. Например, объявление @Service:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Ключевая мета-аннотация
public @interface Service {
    // ...
}

Пример:

@ComponentScan("com.example.app")
@SpringBootApplication
public class Application {}

@Service
public class MyService { } // Будет обнаружен и зарегистрирован как бин

@Repository
public class MyRepo { } // Будет обнаружен и зарегистрирован как бин

Дополнительные возможности: С помощью атрибутов includeFilters и excludeFilters аннотации @ComponentScan можно тонко настраивать, включая или исключая классы по собственным аннотациям или другим критериям.