번호 | 목차 |
---|---|
1. | IoC |
2. | 클래스 의존관계 |
3. | 스프링 컨테이너 |
// 예시
// IoC 컨테이너 또는 DI 컨테이너
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
아래와 같은 클래스 의존관계만으로는 실제 어떤 객체가 OrderServiceImpl
에 주입될지 알 수 없음
(1) 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
(2) 스프링 빈 등록
(3) 스프링 빈 의존관계 설정
@Bean // @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록함. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 함
public MemberService memberService() {
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() { // static 메서드로 설정 시 싱글톤 보장 X
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}