등록해야 할 스프링 빈이 많다면 @Bean 어노테이션을 통해 일일이 등록하기에는 매우 비효율적
➡️ 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능 제공
컴포넌트 스캔을 사용하려면 @ComponentScan 어노테이션을 설정 정보에 붙여주면 된다.
➕ 구현체 클래스(스프링 빈으로 등록할 클래스)에 @Component 어노테이션을 붙여준다.
다만 이전에는 설정 정보(AppConfig)에서 @Bean으로 직접 설정 정보를 작성하고, 의존관계도 명시했으나 컴포넌트 스캔만으로는 의존관계가 설정되지 않음
아래와 같은 수동 주입에서는 orderService는 memberRepository와 discountPolicy에 의존관계 주입 명시
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
➡️ 의존관계 주입할 방법이 필요
➡️ 스프링은 의존관계를 자동으로 주입하는 @Autowired라는 기능 제공
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록
스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자는 소문자로 변경하여 사용
ex) OrderServiceImpl 클래스 ➡️ orderServiceImpl
빈 이름을 직접 지정하려면 @Component("이름") 형식을 통해 지정 가능
생성자 위에 @Autowired 어노테이션을 추가하여 의존관계를 자동으로 주입
생성자에 @Autowired를 지정하면, 스프링 컨테이너가 해당 스프링 빈을 자동으로 찾아 주입함
(기본적으로 타입이 같은 빈을 찾아 주입함)
컴포넌트 스캔을 사용하면 @Configuration이 붙은 설정 정보도 자동으로 등록되기 때문에
설정 정보를 여러 개 사용할 경우, 필요에 따라 'excludeFilters'를 사용하여
다른 설정 정보는 스캔 대상에서 제외할 수 있다.@ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class) )
인프런 스프링 핵심 원리 - 기본편 (김영한) 참조