ComponentScan
@Configuration
@ComponentScan(
basePackages = "hello.core", // 탐색할 패키지의 시작 위치를 지정
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
)
public class AutoAppConfig {
}
// ex) filter로 Configuration을 걸면 @Configuration을 가지고 있는 다른 클래스들을 빼고 등록
@Component
Repository
Service
RateDiscountPolicy...
// @Component로 스캔할 대상을 등록함
- 빈 이름 기본 전략: MemberServiceImpl 클래스 => memberServiceImpl
- 빈 이름 직접 지정: @Component("memberService2") 이런식으로 이름을 부여하면 됌
- AppConfig 패키지 위치 권장 방법
- 프로젝트 시작 루트에 AppConfig 같은 메인 설정 정보를 두고,
- @ComponentScan을 붙이고
- basePackages 지정은 생략한다
- 참고로 스프링 부트를 사용하면 스프링 부트의 시작 정보인 @SpringBootApplication를 프로젝트 시작 루트 위치에 두는 것이 관례임 (이 안에 @ComponentScan이 들어있음)
Filter
- includeFilters: 컴포넌트 스캔 대상을 추가로 지정한다
- excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정한다
@Component 어노테이션 따와서
@interface로 새로 하나 파고
@interface IncludeComponet처럼
필터링 의도에 따라 @IncludeComponent나 기타 정의한 어노테이션을 붙여주고
includeFilters = @Filter(type = FilterType.Annotation, classes = IncludeComponent.class)
이러한 형식으로 ComponentScan에 옵션을 준다
- FilterType 옵션
- ANNOTATIONS: 기본값, 어노테이션을 인식
- ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작
- ASPECTJ: AspectJ패턴 사용
- REGEX: 정규 표현식
- CUSTOM: TypeFilter이라는 인터페이스를 구현해서 처리
- @Component면 충분하기 때문에, includeFilters를 사용하는 일은 거의 없음
중복 등록 충돌
- 자동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록 vs 자동 빈 등록
- 이 경우 수동 빈이 우선권을 가진다
- 하지만 현실은 개발자가 의도적으로 설정해서 그렇다기 보다는 여러 설정들이 꼬인 경우가 많다
- 애매한 버그가 되기가 쉬워 스프링 부트에서는 충돌나면 오류를 발생하도록 바꾸었다
'Spring > Basic' 카테고리의 다른 글
[Basic] 빈 생명주기 콜백 (0) | 2024.08.27 |
---|---|
[Basic] 의존관계 주입 (0) | 2024.08.27 |
[Basic] 싱글톤 컨테이너 (0) | 2024.08.27 |
[Basic] BeanFactory / ApplicationContext (0) | 2024.08.27 |
[Basic] 의존 관계 설정 관련해서 알면 좋은 개념 (0) | 2024.08.21 |