@Configuration
@ComponentScan
public class AutoAppConfig {
}
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.@Component("memberService2") 이런식으로 이름을 부여하면 된다@Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.getBean(MemberRepository.class)와 동일하다고 이해하면 된다.모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.
@ComponentScan(
basePackages = {"hello.core", "hello.service"}
)
basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다.basePackages를 지정하지 않으면 기본적으로 @ComponentScan이 붙은 클래스 위치 기준 하위 패키지를 모두 탐색한다.권장하는 방법
개인적으로 즐겨 사용하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 최근 스프링 부트도 이 방법을 기본으로 제공한다.
참고로 스프링부트를 사용하면 스프링부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 위치에 두는 것이 관례이다. (이 설정 안에 바로 @ComponentScan이 들어 있다.)
includeFilters: 컴포넌트 스캔 대상을 추가로 지정한다.excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정한다.includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
FilterType 5가지 옵션
ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
ex) org.example.SomeAnnotation
ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
ex) org.example.SomeClass
ASPECTJ: AspectJ 패턴 사용
ex) org.example..*Service+
REGEX: 정규 표현식
ex) org\.example\.Default.*
CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
ex) org.example.MyTypeFilte
참고: @Component면 충분하기 때문에, includeFilters를 사용할 일은 거의 없다. excludeFilters는 여러가지 이유로 간혹 사용할 때가 있지만 많지는 않다.
특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 개인적으로는 옵션을 변경하면서 사용하기보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장하고, 선호하는 편이다
ConflictingBeanDefinitionException예외 발생Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true