해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.
지금이야 간단한 프로젝트에서 구성을 하니 당연히 Component 를 스캔하는데 얼마 걸리지 않겠지만, 실무에서는 다르다.
그렇기에 우리는 우리가 필요한 부분만 스캔하도록 하는 basePackages
또는 basePackageClasses
옵션을 이용해서 좀 더 빠르게 스캔하도록 할 수 있다.
basePackages
: 스캔할 패키지의 위치를 지정한다. 지정할때 값은 String 값으로 입력해주면 된다. basePackages = "com.core.carTest"
basePackageClasses
: 지정한 클래스의 패키지를 스캔할 위치로 지정한다.basePackagesClasses = AutoApplicationConfiguration.class
만약 아무것도 지정하지 않는다면?
default는 @ComponentScan
이 붙은 configuration 클래스의 패키지가 시작 위치가 된다.
왠만하면 기본 설정에 따르는 것이 제일 좋다!
저번에 말했던 유의점이다. 다음과 같은 어노테이션은 @Component
어노테이션을 기본으로 포함한다.
@Controller
@Service
@Repository
@Configuration
참고1 : '상속'이 아니라 '포함' 이라고 한 이유는 어노테이션 간에는 상속관계라는 것이 없기 때문이다. 그렇기에 특정 어노테이션을 통해서 다른 어노테이션을 인식하는 것은 자바의 기능이 아닌 스프링의 기능이다.
참고2 : 추가로 저위의 언급된 어노테이션들은 다음과 같은 기능을 동시에 수행한다.
@Controller
: Spring MVC 컨트롤러로의 인식@Service
: 그냥...아무처리 안함, 이게 서비스구나...라고 사람이 인식?@Repository
: Spring 데이터 접근 계층으로 인식, 데이터 계층의 예외들을 모두 추상화되어있는 스프링 예외로 변경@Configuration
: Spring 설정 정보로의 인식, 스프링 빈이 싱글톤을 유지할 수 있도록 추가 처리
includeFilters
: componentScan에서 추가할 대상excludeFilters
: componentScan에서 제외할 대상사용하는 방법은 다음과 같다.(include나 exclude나 사용방법은 동일하다.)
@ComponentScan(
excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "hello\\.core\\.carTest\\..*"),
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) // 기존에 만든 다른 configuration 클래스들이 빈으로 등록되는 것을 막기 위해서 제외시킨다.
})
type에 따라서 정규표현식을 , 어노테이션을 필터로 쓸 수도 있다.
해당 FilterType 옵션은 다음과 같다.
TypeFileter
라는 인터페이스를 구현해서 처리