스프링 빈을 등록하는 전통적인 방식은 XML의 을 통해 등록하거나 아래처럼 자바 코드의 @Bean을 이용해 config파일에서 나열하는 것 입니다.
@Configuration
public class AppConfig {
@Bean
public aRepository aRepository() {
return new ARepository();
}
@Bean
public bClass bClass(){
return new BClass();
}
}
등록할 빈이 몇개 안된다면 큰 문제 없고 오히려 한눈에 보기 편할 수 있겠지만, 빈이 수십 수백개가 된다면 일일이 등록하는 것도 일이고, 누락되는 경우도 발생하게됩니다.
그래서 스프링은 config클래스 없이 자동으로 빈을 등록하는 컴포넌트 스캔을 제공하고있습니다.
컴포넌트 스캔을 설정할 수 있습니다.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
AutoAppConfig 클래스를 만들고 @Configuration, @ComponentScan 어노테이션을 붙여줍니다.
excludeFilters: 특정 어노테이션, 클래스들을 컴포넌트 스캔 대상에서 제외할 수 있습니다.
ex)
@CompoenetScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
basePackages: 스캔 대상 탐색 시작위치를 지정합니다. 이 패키지를 포함해 하위 패키지를 모두 스캔합니다. 만약 지정하지 않으면 @ComponentScan이 붙은 클래스 패키지가 시작위치가 됩니다.
ex)
@ComponentScan(basePackages = "hello.core")
스프링 부트를 사용한다면 대표 시작정보인 @SpringBootApplication을 프로젝트 루트에 두는 것이 관례인데, @ComponentScan이 이 안에 포함되어있습니다. 따라서 따로 설정하지 않아도 됩니다.
컴포넌트 스캔은 @Component 어노테이션이 붙은 클래스들을 클래스 명에서 첫번째 알파벳을 소문자로 바꾼 이름을 가진 빈으로 등록합니다.
ex) MemberRepository -> memberRepository
만약 빈 이름을 지정하고 싶다면 @Component("빈이름")으로 직접 부여할 수 있습니다. 단 이미 존재하는 빈 이름일 경우 나중에 등록한 빈으로 오버라이딩 해버립니다.
다음 어노테이션들은 @Component 어노테이션을 가지고있어 스캔 대상에 포함됩니다.
@Controller
@Service
@Repository
@Configuration