ch05. 컴포넌트 스캔

728x90
참고 도서 : 스프링5 프로그래밍 입문 - 최범균 저

ch05. 컴포넌트 스캔

                                                 cf. 의존 자동 주입: 이미 빈 객체이지만 설정 코드에 따로 주입되지 않았을 때 사용

[컴포넌트 스캔]

- 스프링이 (아직 빈 객체X) 직접 클래스 검색해서 빈으로 등록해주는 기능
- 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록
- 스프링이 따로 검색해서 빈 등록해주므로 설정 코드가 줄어든다.

   ▶[스캔 대상 지정 ] | @Component

-클래스에 @Component 붙이면, 해당 클래스는 스캔 대상이 됨

-@Component에 값을 주면 빈 자동 등록될 이름 지정됨

          @Component : 값을 주지 않으면
              public class Apple { }                          -> 클래스 이름 첫 글자 소문자로 바꾼 이름 = 빈 이름

          @Component(“속성값”) : 값을 주면
              public class Apple { }                           -> 속성값 = 빈 이름

   ▶[스캔 설정] | @ComponentScan

-스캔 대상 클래스를 스캔해서 스프링 빈으로 등록하기 위해서는

설정 클래스에서 @ComponentScan 적용해야 한다.

-basePackages 속성값은 스캔 대상 패키지 목록을 지정함.

                      // 코드는 spring 패키지와 그 하위 패키지에 속한 클래스들을 스캔 대상으로 설정

@Configuration
@ComponentScan(basePackages = {"spring"} )
public class 설정클래스 {
...
}

[스캔 대상에 제외/포함]

-@ComponentScanexcludeFilters 속성 사용 시, 스캔 시 특정 대상을 자동 등록 대상에서 제외 O

                                //pattern 속성은 String[] 타입이므로 배열 { }이용해서 패턴 한 개 이상 지정O

▶[@Filtertype 속성값 설정]

         ➀ FilterType.REGEX

이 타입은 정규표현식을 사용하여 제외 대상 지정
pattern 속성은 “spring. 으로 시작하고 Dao로 끝나는 정규표현식 작성하여 
                                         spring.MemberDao 클래스를 스캔 대상에서 제외시킴
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.REGEX, pattern = "spring\\..*Dao"))

         ➁ FilterType.ASPECTJ

이 타입은 AspectJ 패턴을 사용하여 제외 대상을 지정
pattern 속성은 “spring 패키지의 Dao로 끝나는” AspectJ패턴 사용하여 제외시킴
, AspectJ 패턴 동작하려면 의존 대상에 aspectjweaver 모듈 추가해야 함
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ASPECTJ, pattern = "spring.*Dao"))

         ➂ FilterType.ANNOTATION

-이 타입은 특정 애노테이션 붙인 타입을 제외 대상으로 지정
-classes 속성은 필터로 사용할 애노테이션 타입을 값으로 준다.
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = {NoProduct.class, ManualBean.class} ))

         ➃ FilterType.ASSIGHNABLE_TYPE

-이 타입은 특정 객체 타입이나 그 하위 타입을 제외 대상으로 지정
-classes 속성에는 제외할 객체 타입 목록을 지정함.
@ComponentScan(basePackages = {"spring"},
excludeFilters = @Filter(type = FilterType.ASSIGHNABLE_TYPE,
classes = memberDao.class))

         ➄ 설정 피터 여러 개인 경우 -> 배열 { }로 필터 목록 전달

@ComponentScan(basePackages = {"spring"},
excludeFilters = {
@Filter(type = FilterType._, classes = __),
@Filter(type = FilterType._, pattern = __)
})

[기본 스캔 대상]

다음 애노테이션 붙은 클래스는 모두 스캔 대상에 포함된다,

                                    //Aspect 제외 나머지는 실제로 Component 관련 O 
@Component
@Controller //MVC 와 관련
@Sercive
@Repository //DB 연동과 관련
@Aspect
@Configuration

 

[컴포넌트 스캔 충돌 처리]

A. 빈 이름 충돌

-다른 패키지에 동일 이름 클래스가 각각 존재하며 동시에 @Component붙인 상태
-이 상태에서 두 패키지를 대상으로 컴포넌트 스캔 설정 시 -> 에러
-다른 패키지에 속하는 다른 타입이지만 같은 빈 이름을 사용하는 경우

둘 중 하나에 명시적으로 빈 이름 지정해야 이름충돌 피할 수 O

B. 수동 등록 빈과 충돌

-스캔할 때 사용하는 빈 이름과 수동 등록한 빈 이름이 같은 경우 수동 등록 우선
-, 설정 클래스에서 수동으로 정의한 빈 1개만 존재함
                                         cf. 수동, 자동 등록 시 서로 다른 이름으로 등록할 경우에는 2개의 빈 생성됨

728x90