# 컴포넌트 스캔, 왜 사용하는가?
# 기본 스캔 대상: @Component
# 컴포넌트 스캔 사용법
# 스캔 대상에서 제외하기
# 스프링 빈 충돌 처리
설정 클래스에 일일이 @Bean으로 등록하지 않아도
스프링이 직접 일반 클래스 중 @Component를 검색해서 빈으로 등록해주는 기능.
=> 설정 클래스 코드(@Configuration)를 짧게 쓸 수 있다!
@Component 애노테이션으로 스캔 대상 지정
// 일반 클래스
@Component("listPrinter") // 이곳에 이름을 지정하지 않으면
public class MemberListPrinter { // 클래스 이름의 첫글자를 소문자로 바꾼 memberInfoPrinter를 이름으로 사용
(생략)
}
// 설정 클래스
@Configuration
@ComponentScan(basePackages = {"spring"}) // 지정한 패키지와 그 하위 패키지에 속한 클래스를 스캔한다
public class AppCtx {
@Bean
public MemberPrinter printer() { // 한정자: printer
return new MemberPrinter();
}
@Bean
@Qualifier("mprinter") // 한정자: mprinter
public MemberPrinter printer2() {
return new MemberPrinter();
}
}
// 일반 클래스
// 빈을 가져올 때
ctx.getBean("빈 이름", 클래스명.class)
excludeFilters 속성
사용 시 자동 등록 대상에서 제외된다.
이후로는 MemberDao 클래스를 제외하는 여러 예시를 소개한다.
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Filtertype;
import org.springframework.context.annotation.ComponentScan.Filter;
@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.REGEX, pattern = "spring\\..*Dao")) // 여기
public class AppCtxWithExclude {
(생략)
}
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ASPECTJ, pattern = "spring.*Dao"))
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = {NoProduct.class, ManualBean.class} ))
@NoProduct
@ManualBean
배열을 이용하여 여러 개 지정할 수도 있다.
classes = [ AAA.class, BBB.class ]
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE,
classes = MemberDao.class ))
① 서로 다른 타입의 빈이 동일한 이름을 사용할 경우
ConflictingBeanDefinitionException 발생
② 일반 클래스에 @Component를 사용한 상태에서 (자동 방식)
설정 클래스에서 @Bean으로 같은 타입의 객체를 수동등록하려는 경우
1. 컴포넌트 스캔은 설정 클래스에 일일이 @Bean으로 등록하지 않아도 스프링이 직접 일반 클래스 중 (컴포넌트, @Component) 어노테이션을 붙인 클래스를 검색해서 빈으로 등록해주는 기능이다.
2. 기본으로 등록되는 어노테이션으로는 ( ) 6가지가 있다.
3. 위 어노테이션들은 모두 (@Component) 어노테이션을 포함하고 있다.
4. (excludeFilters) 속성 사용 시 자동 등록 대상에서 제외할 수 있다.
5. 위 속성을 사용해서 제외하는 방식 3가지: (정규 표현식), (특정 애노테이션), (특정 타입이나 그 하위 타입(클래스))
6. 스프링 설정 파일에서 자동 스캔을 위해 (@ComponentScan) 어노테이션을 사용한 상태에서, ( @Bean ) 어노테이션으로 같은 타입의 객체를 수동 등록하려는 경우 (수동 등록)한 빈이 우선된다.
7. (다른 이름)을 사용하여 같은 타입의 빈이 여러 개 존재할 수 있으며, 사용 시 알맞은 빈을 선택해야 한다.
Corner Spring #2
Editor : 유즈
[스프링2] 7장. AOP 프로그래밍 (0) | 2022.11.10 |
---|---|
[스프링2] 6장. 빈 라이프사이클과 범위 (0) | 2022.10.13 |
[스프링2] 4장. 의존 자동 주입 (0) | 2022.10.13 |
[스프링2] 3장. 스프링 DI (0) | 2022.10.06 |
[스프링2] 2장. 스프링 시작하기 (1) | 2022.09.29 |