참고 도서 : 스프링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 설정클래스 { ... } |
[스캔 대상에 제외/포함]
-@ComponentScan의 excludeFilters 속성 사용 시, 스캔 시 특정 대상을 자동 등록 대상에서 제외 O
//pattern 속성은 String[] 타입이므로 배열 { }이용해서 패턴 한 개 이상 지정O
▶[@Filter의 type 속성값 설정]
➀ 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개의 빈 생성됨 |
'Web(웹)_관련 공부 모음 > [개념]_스프링 5 프로그래밍' 카테고리의 다른 글
ch07. AOP 프로그래밍 (0) | 2022.01.27 |
---|---|
ch06. 빈 라이프사이클과 범위 (0) | 2022.01.27 |
ch04. 의존 자동 주입 (0) | 2022.01.26 |
ch03. 스프링 DI (0) | 2022.01.25 |
ch02. 스프링 시작 (0) | 2022.01.24 |