자동 주입(@Autowired)과 함께 사용하는 추가 기능이 컴포넌트 스캔이다.
컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다.
@Component 애노테이션으로 스캔 대상 지정
@Component 애노테이션에게 준 값에 따라 빈 등록시 사용할 이름이 결정된다.
ex) @Component("infoPrinter") // infoPrinter가 Bean 이름이 된다.
@Component 애노테이션에 값이 설정 되지 않은 경우, 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용한다.
@ComponentScan 애노테이션으로 스캔 설정
@Component 애노테이션을 붙인 클래스를 스캔해서 스프링 빈으로 등록하려면 설정 클래스에 @ComponentScan 애노테이션을 적용해야 한다.
ex) @ComponentScan(basePackages={"spring"})// 배열타입처럼 {"spring","main","config"}같이 여러개 추가 가능, 지정된 패키지만 검색한다.
위 예제와 같이 설정하면 spring 패키지와 그 하위 패키지에 속한 클래스를 스캔대상으로 설정한다.
특정 타입이나 그 하위 타입을 컴포넌트 대상에서 제외하려면 ASSIGNABLE_TYPE을 FilterType으로 사용한다.
ex) @ComponentScan(basePackages = {"spring", "spring2" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = ManualBean.class )})
수동 등록한 빈과 충돌
@Configuration
@ComponentScan(basePackages = {"spring"})
public class AppCtx {
@Bean
public MemberDao memberDao1() {
MemberDao memberDao = new MemberDao();
return memberDao;
}
위 예제는 스캔으로 등록한 memberDao 빈과 수동 등록한 memberDao1 빈이 모두 존재한다.
MemberDao 타입의 빈이 두 개가 생성되므로 자동 주입하는 코드는 @Qualifier 애노테이션을 사용해서 알맞은 빈을 선택한다.
'Java > JavaSpring' 카테고리의 다른 글
Chap 7. AOP 프로그래밍 (0) | 2022.06.27 |
---|---|
Chap 6. 빈 라이프사이클과 범위 (0) | 2022.06.24 |
Chap 4. 의존 자동 주입 (0) | 2022.06.20 |
Chap 3. 스프링 DI (0) | 2022.06.20 |
Chap 2. 스프링 시작하기 (0) | 2022.06.14 |