♪ 학습 내용
컴포넌트 스캔 및 의존관계 자동 주입
* 컴포넌트 스캔
여태까지 스프링 컨테이너에 빈을 등록하기 위해서는 설정 정보에 @Bean을 이용
만약 스프링 빈으로 등록할 게 수천 수만가지라면 ?
컴포넌트 스캔( @ComponentScan ) 을 이용하면 더 간단하게 빈 등록할 수 있다.
설정 정보에 @ComponentScan을 붙이고 Bean으로 등록할 클래스 앞에 @Component를 붙여준다
그러면 @ComponeneScan에서 @Component 을 스캔 후 빈으로 등록한다.
기본적으로 @Configuration 도 내부적으로 @Component를 포함하고 있기 때문에 탐색 조건에 해당한다
앞서 만들었던 설정 정보(수동 Bean 등록)랑 겹치면 안되니까 스캔 대상에서 제외했다.
* 의존관계 자동 주입
기존 설정 정보에서는 등록할 Bean을 나열하면서 의존 관계도 나타내주었지만,
컴포넌트 스캔을 한 뒤로 의존 관계에 대한 내용을 어디서도 찾아 볼 수가 없다.
@Autowired 를 이용해 의존관계를 자동으로 주입해준다
@Autowired 사용하면 생성자에서 여러 의존관계 한번에 주입 받을 수 있다.
파라미터 속 타입(MemberRepository.class, DiscountPolicy.class)에 맞는 Bean찾아 의존관계 자동 주입
마치 ac.getBean(MemberRepository.class) 과 비슷하다
컴포넌트 스캔과 의존관계 자동 주입으로 MemoryMemberRepository에 의존하는 MemberService 가 Bean으로 등록?
실행결과 : 성공
+ 로그를 통해서도 컴포넌트 스캔이 작동되는 것을 확인 가능하다
* 컴포넌트 스캔 및 의존관계 자동 주입 정리
@ComponentScan
- @ Component 붙은 클래스 모두 스프링 빈 등록(싱글톤)
- 빈 이름은 클래스명에서 소문자 앞글자 / @Component( "이름" ) 통해 임의로 이름 지정도 가능하다
@Autowired
- 생성자에 지정하면 스프링 컨테이너가 자동으로 스프링 빈 찾아 주입
- 타입이 같은 빈을 찾아 주입
만약 타입이 같은 빈이 두개 이상이라면..? (뒤에서 학습)
* 컴포넌트 탐색 위치
모든 자바 클래스를 다 스캔하기에는 시간 효율 x
필요한 위치를 탐색 스캔한다
- basePackages : 탐색 시작할 패키지를 지정 / 해당 패키지를 포함하여 하위 패키지 탐색
- basePackageClasses : 지정한 클래스의 패키지부터 탐색 시작
디폴트 : @ComponentScan 붙은 클래스의 패키지부터 시작
ex)
hello.core 패키지부터 탐색 시작. core 하위 패키지도 전부 탐색
! 프로젝트 시작 루트( ex) hello.core )에 메인 설정정보 ( ex) AppConfig ) 를 두고 @ComponentScan 붙이고
따로 지정 x 를 김영한님은 권장하는 바 !
→ hello.core 포함 하위 모두가 컴포넌트 스캔의 대상
* 컴포넌트 스캔 대상
사실 컴포넌트 스캔은 오직 @Component만 스캔하는 것이 아니다.
like 앞에서 @Configuration도 스캔하여 Bean등록
@Component / @Controller / @Service / @Repository / @Configuration 을 스캔 대상으로 한다.
실제로 해당 애노테이션 들어가서 코드 보면 모두가 내부적으로 @Component 포함하고 있다
+ 해당 애노테이션들을 통해 스프링은 추가적인 기능을 수행한다
♪ 다음 학습 내용
컴포넌트 스캔 필터 및 Bean 중복 등록
'Dev > Spring' 카테고리의 다른 글
[Spring 기본] 의존관계 자동 주입 (1) (0) | 2022.11.13 |
---|---|
[Spring 기본] 컴포넌트 스캔 (2) (0) | 2022.11.12 |
[Spring 기본] 싱글톤 컨테이너 (2) (0) | 2022.11.09 |
[Spring 기본] 싱글톤 컨테이너 (1) (0) | 2022.11.09 |
[Spring 기본] 스프링 컨테이너와 빈 (3) (0) | 2022.11.07 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!