위의 게시물에서 DI 컨테이너를 이용해서 객체의 생성과 의존성 주입을 했다.
이제는 스프링 컨테이너를 적용해 스프링 기반으로 전환을 해보고 생성 과정을 정리해보자.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
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);
...
}
new ApplicationContext(AppConfig.class)
@Configuation
이 붙은 클래스를 설정 정보로 사용@Bean
이 적힌 메서드를 모두 호출해 반환된 객체를 스프링 컨테이너에 등록한다.applicationContext.getBean(”이름”, <타입>)
을 이용해 찾을수있다. new AnnotationConfigApplicationContext(AppConfig.class)
설정 클래스 AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
@Bean
이 스프링 빈@Bean(name="")
으로 빈 이름 지정 가능하다.