package isntkyu.core;
import isntkyu.core.discount.DiscountPolicy;
import isntkyu.core.discount.FixDiscountPolicy;
import isntkyu.core.discount.RateDiscountPolicy;
import isntkyu.core.member.MemberRepository;
import isntkyu.core.member.MemberService;
import isntkyu.core.member.MemberServiceImpl;
import isntkyu.core.member.MemoryMemberRepository;
import isntkyu.core.order.OrderService;
import isntkyu.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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 FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
AppConfig 라는 클래스
순수한 자바 코드로 이해했을 경우
순서로 Bean 을 가져가게되면
MemberService와 OrderService 에서 각각 MEmberRepository 객체를 생성하여 리턴하기 때문에
call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
call AppConfig.memberRepository
call AppConfig.memberRepository
이 호출순서를 예상할 수 있다.
하지만 이는 싱글톤 방식의 위배 되기 때문에
싱글톤 방식을 보장하려는 스프링의 어노테이션이 있다
이 어노테이션을 붙여 주어야 스프링에서
call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
순서로 memberRepository가 중복되지 않고 싱글톤 방식이 보장되는 것을 테스트 코드를 통해 확인했다.