컴포넌트 스캔
컴포넌트 스캔이란 빈을 따로 등록하지 않아도 @Component라는 어노테이션이 붙은 객체들을 스프링 컨테이너가 관리해주는 기능이다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
classes = Configuration.class는 AppConfig를 빼주는 용도이다. 보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지 않지만 기존 예제 코드를 유지하기 위해서 이 클래스에서 제외하는 것을 했다.
코드를 보면 알겠지만 @Bean으로 따로 빈을 등록해주지 않았다.
- 참고로 스프링 부트의 대표 시작 정보인 @SpringBootApplication안에 @ComponentScan이 들어있다. 스프링부트를 사용할 때에는 @ComponentScan을 따로 해줄 필요가 없다.
@Component도 따로 해줄 필요가 없는데, 왜냐면 @Controller, @Service, @Repository, @Configuration에 이미 들어가 있기 때문이다. @Autowired도 @RequiredArgsConstrucotr라는 롬복에서 지원하는 어노테이션으로 자동 주입이 가능하긴 하다. 그래도 사용하는 기능의 원리는 이해해야하기 때문에 공부는 꼭 필요하다.
@Component
@Component
public class MemoryMemberRepository implements MemberRepository{
....
}
@Component
public class MemberServiceImpl implements MemberService {
....
}
@Component
public class RateDiscountPolicy implements DiscountPolicy {
....
}
사용하는 구현체들의 선언부에 @Component라는 어노테이션을 붙인다. 하지만 이러한 방식은 스프링 빈에 등록해줄뿐, 의존관계 주입은 해주지 않는다.
@Autowired
@Component
public class MemberServiceImpl implements MemberService {
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
....
}
생성자에 @Autowired라는 어노테이션을 넣으면 해당하는 memberRepository의 구현체를 자동으로 의존관계 주입시켜준다.
@Component
public class OrderServiceImpl implements OrderService{
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
....
}
OrderServiceImpl에도 @Autowired를 통해서 자동으로 의존관계 주입을 해준다.