AppConfig

 

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy(){
        return new RateDiscountPolicy();
        //return new FixDiscountPolicy()
    }

}

- @Configuration : 설정 정보라는 것을 의미

- @Bean : @Bean을 붙이면 스프링 컨테이너에 Bean으로 등록됨

 

 

public class MemberApp {

    public static void main(String[] args) {
        
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = ac.getBean("memberService", MemberService.class);

        Member member = new Member(1, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);        
    }

}

 

스프링 컨테이너

- 위에서 사용한 ApplicationContext가 스프링 컨테이너임

- ApplicationContext는 인터페이스임

- 스프링 컨테이너는 AppConfig처럼 애플리케이션의 제어권을 가지고 의존관계 주입을 해주는 역할을 함

- @Configutation이 붙은 AppConfig를 어플리케이션의 설정 정보로 활용하여 Bean을 등록하고 의존관계를 형성함

- @Bean이 붙은 메서드의 메서드 명을 Bean이름으로 등록함 (빈 이름은 각각 달라야 함)

- getBean() 메서드로 스프링 컨테이너에 등록된 Bean을 찾아올 수 있음

- getBean(빈 이름, 타입) / getBean(타입)

 

 

BeanFactory <- ApplicationContext <- AnnotationConfigApplicationContext(Java설정 클래스 사용)

                                                                  <- GeneralXmlApplicationContext(XML 설정 파일 사용)

 

BeanFactory 

- 스프링 컨테이너의 최상위 인터페이스

- Bean관리, 조회, getBean() 메서드 제공

 

ApplicationContext

- BeanFactory + 부가기능

 

 

BeanDefinition

- xml, java설정 정보를 활용하여 BeanDefinition을 만듦

- 스프링 컨테이너는  BeanDefinition을 보고 Bean을 등록함 => 스프링 컨테이너는 설정 정보가 xml인지, java인지 몰라도도 되고 BeanDefinition에만 의존함