스프링 컨테이너에 직접 빈을 등록하려면 아래와 같은 방식으로 등록한다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
위와 같이 설정 클래스에 @Configuration 어노테이션을 붙힌다.
설정 클래스에 있는 함수들에 일일이 @Bean 어노테이션을 붙히고 의존관계까지 설정해야 했어야 한다.
스프링은 컴포넌트 스캔이란 기능을 지원하여 위에 @Bean으로 등록할때 겪는 수고로움을 덜어준다. 아래의 코드를 보자.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
설정 클래스 위에 @Configuration, @ComponentScan만 붙히면 설정 클래스가 컴포넌트 스캔을 할 준비를 마친다.
이제 컴포넌트 스캔으로 등록하는 방법을 알아보자.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired // 의존관계 자동 주입
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
클래스위에 @Component를 붙혀주면 컴포넌트 스캔의 대상이 되어 컨테이너에 등록되게 된다.
@Configuration에 수동으로 설정한 Bean이 @Componenet를 붙힌 빈보다는 우선순위를 가지게 된다.
@Autowired를 사용하면 생성자에서 여러 의존관계도 한번에 주입받을 수 있다.
스프링 프로젝트에 흔히 보이는 @Controller, @Service, @Reposiory같은 어노테이션도 모두 @Component를 포함하고 있기 때문에 컨테이너에 등록되는 것이다.