책읽기

[스프링5 프로그래밍 입문][chap05] 컴포넌트 스캔

pythaac 2022. 3. 10. 22:01
  • 컴포넌트 스캔
    • [개요] 자동 주입과 함께 사용하는 추가 기능
    • [정의] 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능
    • [편의] 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록 가능
    • [효과] 설정 코드가 크게 줄어듦

 

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 ))
  • 기본 스캔 대상
    • @Component
    • @Controller
    • @Service
    • @Repository
    • @Aspect
    • @Configuration

 

5. 컴포넌트 스캔에 따른 충돌 처리

  • 빈 이름 충돌
    • BeanDefinitionStoreException
  • 수동 등록한 빈과 충돌
    • 수동 등록한 빈이 우선
// 컴포넌트 스캔 대상
@Component
public class MemberDao {
	...
}

// 수동 등록 -> 우선순위가 높음
@Bean
public MemberDao memberDao() {
	return new MemberDao();
}