※ 본 포스팅은 21.10.27에 게시된 글을 이전한 것 입니다.
1. 컴포넌트 스캔
스프링에서 설정 정보 없이 자동으로 스프링 빈을 등록하는 기능
자바에서 스프링 빈을 등록하기 위해 @Bean을 사용해야 하지만, 하나하나 등록하는 것은 번거롭다.
이러한 경우에 컴포넌트 스캔을 통해 자동으로 스프링 빈을 등록한다.
@Component 애노테이션이 붙은 클래스를 스캔해 스프링 빈으로 등록한다.
2. 컴포넌트 스캔 의존 관계 주입
@Autowired는 의존 관계를 자동으로 주입해 준다
- 1)로그 확인: 의존관계가 주입됨을 알 수 있다.
- 2) 의존관계 주입 순서
① @ComponentScan
@Component 애노테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다.
※@Component("원하는 이름")을 통해 이름을 직접 부여할 수 있지만 일반적으로는 클래스 이름의 첫 글자를 소문자로 바꿔서 저장
② @Autowired 의존관계 자동 주입
생성자가 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입함
생성자에 파라미터가 많아도 다 찾아서 자동으로 주입한다.
3. 탐색 위치 및 기본 스캔 대상
- 1) 탐색 위치
@ComponentScan{
#시작 위치 한개
basePackages="hello.core",
#시작 위치 여러개
basePackages={"hello.core","hello.service"}
}
basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
만약 지정하지 않은 경우에는 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
※권장
패키지 위치를 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 둔다.
최상단 패키지인 hello.core 안에 AutoConfig와 같은 메인 설정 정보를 두고, @ComponentScan 애노테이션을 붙인다.
※참고
스프링 부트를 사용하면. @SpringBootAplication를 이 프로젝트 시작 루트에 두는 것이 관례이다.
위 설정 안에 @ComponentScan이 들어 있다.
- 2) 기본 스캔 대상
해당 클래스의 소스코드를 보면 @Component를 포함하고 있다.
단, 애노테이션 간의 상속관계가 아닌! 이는 스프링이 지원하는 기능이다.
4. 필터
includeFilters : 컴포넌트 스캔 대상을 추가로 지정함
excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정
@Configuration
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION,classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION ,classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig{
}
- 1) Type
※권장
최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공한다. 변경하기보단 기본 설정에 맞추어 사용한다.
5. 중복 등록과 충돌
일단 자동 빈 등록은 충돌될 일이 거의 없고, 수동 빈 등록 대 자동 빈 등록은 수동 빈 등록이 우선권을 가진다.
Uploaded by
'📑 개발 이론 > 🌱 SPRING' 카테고리의 다른 글
스프링 핵심 원리 - 빈 생명주기 콜백 (0) | 2023.06.26 |
---|---|
스프링 핵심 원리 - 의존관계 자동주입 (0) | 2023.06.26 |
스프링 핵심 원리 - 싱글톤 (0) | 2023.06.17 |
스프링 핵심 원리 - 스프링 빈 (0) | 2023.06.17 |
스프링 핵심 원리 - 스프링 컨테이너 (0) | 2023.06.17 |