Application Context에서 스프링 빈을 등록할 때, 빈으로 등록할 후보 클래스들을 탐지하여 등록한다.
<context:conponent-scan> 에서는 @Component만 스캔하도록 되어있다.
당연하게 쓰던 어노테이션을 따라가서 소스를 살펴보자....
ex) @Controller
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Controller {
String value() default "";
}
소스에서 알 수 있듯, 사실상 @Controller, @Service, @Repository를 바로 찾는것이 아니고, 해당 어노테이션에 @Component 어노테이션이 명시되어 있기 때문에 스캔되는 것이다.
@Service와 @Repository도 마찬가지이다. 즉, 이 3개의 어노테이션은 @Component 를 기능별로 세분화 시켜놓은 어노테이션이라고 이해할 수 있으며 이들은 자체적으로 @Component를 가지고 있기 때문에 스캔되는 것이다.