- 컴포넌트 스캔
- [개요] 자동 주입과 함께 사용하는 추가 기능
- [정의] 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능
- [편의] 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록 가능
- [효과] 설정 코드가 크게 줄어듦
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 ))
- @Filter(type=FilterType.REGEX, ~)
- 기본 스캔 대상
- @Component
- @Controller
- @Service
- @Repository
- @Aspect
- @Configuration
5. 컴포넌트 스캔에 따른 충돌 처리
- 빈 이름 충돌
- BeanDefinitionStoreException
- 수동 등록한 빈과 충돌
- 수동 등록한 빈이 우선
// 컴포넌트 스캔 대상
@Component
public class MemberDao {
...
}
// 수동 등록 -> 우선순위가 높음
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
'책읽기' 카테고리의 다른 글
[스프링5 프로그래밍 입문][chap06] 빈 라이프사이클과 범위 (0) | 2022.03.10 |
---|---|
[스프링5 프로그래밍 입문][chap04] 의존 자동 주입 (0) | 2022.03.08 |
[스프링5 프로그래밍 입문][chap03] 스프링 DI (0) | 2022.03.04 |
[스프링5 프로그래밍 입문][chap01/chap02] 들어가며/스프링 시작하기 (0) | 2022.02.04 |
[파이썬 알고리즘 인터뷰] 14장 - 트리 (0) | 2021.09.13 |