Ответ
@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 можно тонко настраивать, включая или исключая классы по собственным аннотациям или другим критериям.