TIL

컴포넌트 스캔

컴포넌트 스캔과 의존 관계 자동 주입

@ComponentScan

@Configuration
@ComponentScan
public class AutoAppConfig {
}

@Autowired 의존 관계 자동 주입

탐색 위치와 기본 스캔 대상

모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.

@ComponentScan(
		basePackages = {"hello.core", "hello.service"}
)

권장하는 방법

개인적으로 즐겨 사용하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 최근 스프링 부트도 이 방법을 기본으로 제공한다.

참고로 스프링부트를 사용하면 스프링부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 위치에 두는 것이 관례이다. (이 설정 안에 바로 @ComponentScan이 들어 있다.)

필터

includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)

FilterType 5가지 옵션

참고: @Component면 충분하기 때문에, includeFilters를 사용할 일은 거의 없다. excludeFilters는 여러가지 이유로 간혹 사용할 때가 있지만 많지는 않다.

특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 개인적으로는 옵션을 변경하면서 사용하기보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장하고, 선호하는 편이다

중복 등록과 충돌

자동 빈 등록 vs 자동 빈 등록

수동 빈 등록 vs 자동 빈 등록

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true