스프링 컨테이너
지금까지는 순수한 java코드로만 의존성을 주입했지만 이제 스프링을 적용해보겠습니다.
설정파일을 뜻하는 @Configuration 어노테이션을 붙여주고 각각의 메서드에 @Bean을 붙여줘서 스프링빈으로 등록해줍니다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
....
}
이전에는 MemberService를 AppConfig에서 받아왔다면 이제는 스프링 컨테이너에서 스프링빈의 형태로 가져옵니다.
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
}
}
같은 원리로 orderapp도 수정해줍니다.
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
}
}
스프링 컨테이너 생성 과정
스프링 컨테이너는 ApplicationContext입니다. 스프링 컨테이너는 XML기반과 어노테이션 기반의 자바클래스 이렇게 두가지 방법을 이용해서 생성할 수 있습니다. AppConfig는 어노테이션 기반으로 생성하는 방법이며 따라서 아래와 같은 코드로 컨테이너를 생성하는 것입니다.
//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
그 뒤로 AppConfig에 있는 @Bean을 보고 스프링 빈 저장소에 등록합니다. 그리고 다시 의존관계를 참고해서 스프링 빈끼리 의존관계를 주입해줍니다.
그런데 지금처럼 자바코드만으로 의존성 주입을 작성하면 스프링 빈 생성과 의존성주입이 같이 일어나게 됩니다.