@Configuration // 설정 정보
public class AppConfig {
//@Bean memberService -> new MemoryMemberRepository()
//@Bean orderService -> new MemoryMemberRepository()
@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();
}
}
- memberService빈을 만드는 코드를 보면 'memberRepository()'를 호출한다. -> 이 메서드를 호출하면 'new MemoryMemberRepository()'를 호출한다. - orderService 빈을 만드는 코드도 동일하게 'memberRepository()'를 호출한다. -> 이 메서드를 호출하면 'new MemoryMemberRepository()'를 호출한다.
결과적으로 각각 다른 2개의 'MemoryMemberRepository'가 생성되면서 싱글톤이 깨지는 것 처럼 보인다.
- memberRepository 인스턴스는 모두 같은 인스턴스가 공유되어 사용된다. - AppConfig의 자바 코드를 보면 각 1번 'new MemoryMemberRepository()' 호출해서 총 2번 다른 인스턴스가 생성되어야 하는데 두번 호출이 안되는 것일까 ? 실험을 해보자
AppConfig 수정
@Configuration // 설정 정보
public class AppConfig {
//@Bean memberService -> new MemoryMemberRepository()
//@Bean orderService -> new MemoryMemberRepository()
@Bean //스프링 컨테이너에 빈 등록
public MemberService memberService(){
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(),discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
//예상
//call AppConfig.memberService
//call AppConfig.memberRepository
//call AppConfig.memberRepository
//call AppConfig.orderService
//call AppConfig.memberRepository