스프링 핵심원리-기본편 (김영한님) 수업을 듣고 정리한 글입니다.
컴포넌트 스캔 @ComponentScan
스프링 빈을 자동으로 등록해주는 기능
@Bean 또는 <bean> 등을 통해서 직접 등록하지 않아도 된다.
=> AppConfig에서 @Bean을 이용해서 직접 설정 정보와 의존관계를 명시할 필요가 없다.
@Autowired : 의존관계를 자동으로 주입하는 기능도 있다.
1. 새로 Config 파일을 만든다.
이전의 AppConfig 파일이 적용되지않기 위해 excludeFilters를 사용한다. AppConfig의 @Configuration 이 @Component 어노테이션을 포함하고 있기 때문이다.
2. 사용할 클래스들에게 @Component 어노테이션을 붙인다. (스캔이 되도록)
생성자 코드를 보면 의존관계를 주입해야한다 -> @Autowired: 자동으로 의존관계를 주입해준다.
테스트 코드 작성
동작 그림
탐색 위치와 기본 스캔 대상
basePackages: 탐색할 패키지의 시작 위치 지정
com.hello (프로젝트 시작 루트)에 설정 정보를 두면 그 하위 모두가 컴포넌트 스캔의 대상이 된다.
(스프링 부트를 사용하면 @SpringBootApplication을 시작 루트 위치에 두는 것이 관례이다. 이 설정안에 @ComponentScan이 있다.)
컴포넌트 스캔 기본 대상
@Component, @Controller, @Service, @Repository, @Configuration
=> 각각의 소스코드에 @Component를 포함하고있다.
애노테이션 부가기능
필터
includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정한다.
어노테이션 만들기
클래스 생성(beanA, beanB)
테스트 만들기
includeFilters를 이용해 @MyIncludeComponent 있는 클래스-beanA를 스캔 대상에 추가한다.
excludeFilters를 이용해 @MyExcludeComponent 있는 클래스-beanB를 스캔 대상에 제외한다.
스캔대상에 추가하면 ac.getBean 할때 반환할 객체가 있지만, 스캔대상 제외하면 반환할 객체가 없다.
중복 등록과 충돌
1. 자동빈등록 vs 자동빈등록 이름충돌=> 빈이름 같을때 ConflictingBeanDefinitionException 예외 발생
2. 수동빈등록 vs 자동빈등록 이름충돌 => 수동 빈 등록이 우선권을 가지고 오버라이딩한다.
최근 스프링부트에서는 수동빈등록 vs 자동빈등록 충돌시 오류가 발생하도록 기본값을 바꿨다..(애매한 오류가 발생가능하므로)
'Spring > 스프링 핵심 원리' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2023.02.28 |
---|---|
의존관계 자동주입 (0) | 2023.02.27 |
싱글톤 컨테이너 (0) | 2023.02.13 |
스프링으로 전환하기, 스프링 컨테이너와 스프링 빈 (0) | 2023.02.13 |
IoC, DI, 컨테이너 (0) | 2023.02.03 |