직전 게시글에선 Bean 등록이 필요한 설정 정보를 직접 나열해 진행하는 방법을 알아봤다.
예시는 2개의 Bean 만 등록했지만, 실제론 수백 개의 빈을 등록해야 하기 때문에 어마어마한 작업이다.
그래서 스프링은 자동으로 빈을 등록하는 컴포넌트 스캔이라는 기능이 있다!
@ComponentScan
주석이 붙어있는 클래스는 해당 클래스가 있는 패키지부터 하위 패키지까지 모든 클래스들 스캔해서
@Component 주석이 달린 클래스를 스프링 빈에 등록한다.
* 따라서 기존 클래스 (MemberRepository, MemberService) 에 @Component 주석을 붙어야 한다.
이 클래스를 AutoAppConfig 로 구현하면 아래와 같다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
@ComponentScan 주석 안에 Filter를 통해 특정 클래스는 스캔하지 않거나, 추가로 스캔하는 걸 필터링할 수 있다.
위 코드는 @Configuration 주석이 붙어있는 것은 스캔하지 않는 것이다.
만약 여기에 매뉴얼로 추가 빈을 등록한 경우, 그런데 해당 빈에 @Component 주석이 있어 이중으로 스캔한 경우 오류가 발생한다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
@Bean(name = "memoryMemberRepository")
MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
MemoryMemberRepository 클래스에 이미 @Component 주석이 있고, 추가로 수동 등록한 경우 Spring에서 오류를 발생해 준다!
사용 방법은 기존과 동일하게 컨테이너 생성 후 getBean을 통해 꺼내면 된다.
ApplicationContext ac = new AnnotationCOnfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
'코딩 > JAVA 공부' 카테고리의 다른 글
| [Spring] DI 옵션 처리, 롬복과 최신 트랜드 (0) | 2023.05.16 |
|---|---|
| [Spring] 의존성 관계 자동 주입 (1) | 2023.05.14 |
| [Spring] 스프링 컨테이너 생성 및 Bean 등록 (0) | 2023.05.12 |
| [JAVA] 가변 리스트, 불변 리스트 / 리스트에서 반복문 사용하기 (0) | 2023.04.12 |
| [JAVA} 가변인수, Wrapper Class (0) | 2023.04.09 |