@Component가 붙은
클래스를 빈에 자동으로 등록함
빈은 등록했지만 의존관계를 알수없음
@Autowired
@ComponentScan은 @Component 가 붙은 모든 클래스를 빈으로 등록함
스프링빈의 기본이름은 클래스명에서 맨앞만 소문자로 사용한다(임의로 부여가능)
생성자에 @Autowired를 지정하면 컨테이너가 자동으로 해당 빈을 찾아서 주입해준다.
이때 조회의 기본전략은 getBean(클래스명.class) 같은식으로 한다.
컴포넌트스캔은 basePackages,baseClasses 로 스캔대상을 지정/제한할수 있다.
붙은 설정정보 클래스 위치가 기본 베이스패키지가 된다.
관례적으로도 @SpringBootApplication에 컴포넌트스캔이 붙어있어서 부트같은경우 기본적으로 제공된다.
다음 클래스들도 컴포넌트 스캔에 포함된다.
@Controlller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용@Repository : 스프링 데이터 접근 계층에서 사용
@Configuration : 스프링 설정 정보에서 사용
어노테이션은 상속관계란게 없다.
어노테이션이 특정 어노테이션을 가지고있다는걸 인식하고 처리하는것은 스프링에서 구현되어있는 기능이다.
필터
컴포넌트스캔을 필터링할수 있다.
includeFilters 를 사용할일은 거의없다.
따라서 Include하는 어노테이션은 따로 사용할필요가 거의 없고(@Component를 사용하면된다)
excludeFilters 로
ExcludeComponent같이 어노테이션을 만들어서 커스텀으로 빈클래스 제외를 구현가능하다.
자동빈등록끼리 같은경우는 당연히 충돌이 난다.
자동 빈 등록 vs 수동 빈 등록의 경우
원래는 수동으로 등록한 빈에 우선권을 가지고 오버라이딩해준다.
하지만 이런경우 실제는 앱이 복잡해질경우 오버라이딩된걸 인식 못하고 설정이 꼬이는 경우가 생긴다.
그래서 스프링 부트는 해당 충돌을 인식하면 오류가 나도록 했다.