스프링 컨테이너 생성

스프링 컨테이너를 생성하고, 설정(구성) 정보를 참고해서 스프링 빈도 등록하고, 의존관계도 설정한다.

  • ApplicationContext를 스프링 컨테이너라 한다.

  • ApplicationContext는 인터페이스이다.

  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.

  • 직전에 AppConfig를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.

  • 자바 설정 클래스를 기반으로 스프링 컨테이너(ApplicationContext)를 만들어보면 다음과 같다. 아래의 클래스는 ApplicationContext 인터페이스의 구현체이다.

pplicationContext applicationContext = new 
  AnnotationConfigApplicationContext(AppConfig.class);

조금 더 정확히 스프링 컨테이너를 부를 때 BeanFactory, ApplicationContext로 구분해서 이야기한다. 이 부분은 뒤에서 설명한다. BeanFactory를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationContext를 스프링 컨테이너라 한다.

  1. 스프링 컨테이너 생성

  • new AnnotationConfigApplication(AppConfig.class)

  • 스프링 컨테이너를 생성할 때는 구성 정보를 지정해줘야한다.

  • 여기서는 AppConfig.class 를 구성 정보로 지정했다.

public class MemberApp {
public static void main(String[] args) {
  ApplicationContext applicationContext
  = new AnnotationConfigApplicationContext(AppConfig.class);
  MemberService memberService
  = applicationContext.getBean("memberService",MemberService.class);//(이름,타입)

2. 스프링 빈 등록 스프링 컨테이너는 파라미터로 넘어온 설정 클래스로 정보를 사용해서 스프링 빈을 등록한다.

@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();
    }
}

빈 이름

  • 빈 이름은 메서드 이름을 사용한다

  • 빈 이름을 직접 부여할 수도 있다. @Bean(name = "memberService2")

  • 주의! 빈 이름은 항상 다른 이름을 부여해야한다! 같은 이름을 부여하면 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생한다.

3. 스프링 빈 의존관계 설정 - 준비

4. 스프링 빈 의존관계 설정 - 완료

  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.

  • 단순히 자바 코드를 호출하는 것 같지만, 차이가 있다. 이 차이는 뒤에 싱글톤 컨테이너에서 설명한다.

참고

스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다. 그런데 이렇게 자바코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다. (이해를 돕기 위해 개념적으로 나누어 설명함)

Last updated