컴포넌트 스캔

binary_j·2022년 1월 29일
0
post-custom-banner

컴포넌트 스캔


스프링이 직접 클래스를 검색해서 Bean으로 등록해주는 기능

  1. 클래스에 @Component 어노테이션 붙이기
    클래스 이름 앞에 @Component를 붙이기만 하면 된다.
    컴포넌트에 별도의 값을 주지 않으면 클래스 이름의 제일 앞글자를 소문자로 한 것이 Bean 이름이 된다.
    만약 Bean에 따로 이름을 붙이고 싶다면 @Component("myBean") 이런식으로 값을 주면 된다.
  2. 설정 클래스에 @ComponentScan 어노테이션 붙이기
    @ComponentScan(basePackages={"스캔할 패키지"})

특정 대상 제외하기, 포함하기


  1. excludeFilters
excludeFilters = @Filer(type = FilterType.REGEX, pattern = "spring\\\\..*Dao")

->spring으로 시작하고 Dao로 끝나는 클래스는 제외
pattern은 문자열 배열 타입이므로 패턴을 여러 개 지정할 수도 있다.

Cf) FilterType.ASPECTJ인 경우

excludeFilters = @Filer(type = FilterType.ASPECTJ, pattern = "spring.*Dao")
  • pom.xml의 dependency에 aspectjweaver 추가 필요
  1. 특정 어노테이션 제외
@Retention(RUNTIME)
@Target(TYPE)
public @interface NoProduct {
}

제외하려면

excludeFilters = @Filer(type = FilterType.ANNOTATION, classes = NoProduct.class)
  1. 특정 타입, 하위 타입 제외
excludeFilters = @Filer(type = FilterType.ASSIGNABLE_TYPE, classes = {MemberDao.class, NoProduct.class})

Cf2) 여러개는 배열 표기 {} 해줌

  1. 필터 두 개 이상 적용
excludeFilters = {
	@Filer(type = FilterType.ANNOTATION, classes = NoProduct.class),
    @Filer(type = FilterType.ASPECTJ, pattern = "spring.*Dao")
}

기본 스캔 대상


@Component
@Controller
@Service
@Repository
@Aspect
@Configuration

컴포넌트 충돌


  1. 서로 다른 타입인데 같은 Bean 이름을 사용하는 경우
  2. 수동 등록한 Bean과 충돌 -> 이름이 같은 경우 수동 등록한 것이 우선
  3. 같은 Bean인데 수동 등록한 것과 컴포넌트 스캔으로 등록한 것의 이름이 다르다면 같은 타입의 Bean이 두개가 되므로 주입 대상 앞에 @Qualifier로 어떤 Bean 사용할 지 지정해 줘야 함
post-custom-banner

0개의 댓글