- 컴포넌트 스캔
- [개요] 자동 주입과 함께 사용하는 추가 기능
- [정의] 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능
- [편의] 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록 가능
- [효과] 설정 코드가 크게 줄어듦
1. @Component 애노테이션으로 스캔 대상 지정
- @Component
- @Component 속성값
- 빈으로 등록할 때 사용할 이름
@Component("infoPrint")
- 속성값이 없으면 클래스 이름에서 첫글자를 소문자로 바꾸어 사용
MemberDao -> memberDao
2. @ComponentScan 애노테이션으로 스캔 설정
- @ComponentScan
- @Component를 붙인 클래스를 스프링 빈으로 등록하려면 설정 클래스에 적용
@Configuration
@ComponentScan(basePackages = {"spring"})
public class AppCtx{
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
}
- @ConponentScan 속성값
- 스캔 대상 패키지 목록
- spring 패키지와 그 하위 패키지에 속한 클래스를 스캔 대상으로 설정
3. 예제 실행
4. 스캔 대상에서 제외하거나 포함하기
- @Filter
- @Filter 속성값
- @Filter(type=FilterType.REGEX, ~)
- 정규표현식으로 제외 대상 설정
- @ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.REGEX, pattern = "spring\\..*Dao"))
- @Filter(type=FilterType.ASPECTJ, ~)
- AspectJ 패턴으로 제외 대상 설정
- aspectjweaver 모듈을 추가해야 사용 가능
- @ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FIlterType.ASPECTJ, pattern = "spring.*Dao"))
- @Filter(type=FilterType.ANNOTATION, ~)
- 특정 애노테이션을 붙인 타입을 제외
- @ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = {NoProduct.class, ManualBean.class} ))
- @FIlter(type=FIlterType.ASSIGNABLE_TYPE, ~)
- 특정 타입이나 그 하위 타입을 제외
- @ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE,
classes = MemberDao.class ))
- 기본 스캔 대상
- @Component
- @Controller
- @Service
- @Repository
- @Aspect
- @Configuration
5. 컴포넌트 스캔에 따른 충돌 처리
- 빈 이름 충돌
- BeanDefinitionStoreException
- 수동 등록한 빈과 충돌
// 컴포넌트 스캔 대상
@Component
public class MemberDao {
...
}
// 수동 등록 -> 우선순위가 높음
@Bean
public MemberDao memberDao() {
return new MemberDao();
}