[Spring] 스프링 컨테이너 생성 과정

Jaeyoo (유재형)·2022년 2월 20일
0
post-thumbnail

스프링 컨테이너 생성 과정


DI 컨테이너란? DI 컨테이너를 사용하는 이유

위의 게시물에서 DI 컨테이너를 이용해서 객체의 생성과 의존성 주입을 했다.
이제는 스프링 컨테이너를 적용해 스프링 기반으로 전환을 해보고 생성 과정을 정리해보자.


1. 스프링 컨테이너로 전환

1) AppConfig

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

2) OrderApp

public class OrderApp {
    public static void main(String[] args) {

//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();
//        OrderService orderService = appConfig.orderService();

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
        ...
}

설명

  • new ApplicationContext(AppConfig.class)
    • ApplicationContext을 스프링 컨테이너라고 한다.
    • 기존에는 DI컨테이너를 사용해 직접 객체를 생성하고 DI를 했지만 이제는 스프링 컨테이너를 사용
  • 스프링 컨테이너는 @Configuation이 붙은 클래스를 설정 정보로 사용
    • @Bean이 적힌 메서드를 모두 호출해 반환된 객체를 스프링 컨테이너에 등록한다.
    • 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
  • 스프링 빈은 applicationContext.getBean(”이름”, <타입>)을 이용해 찾을수있다.
    • 기존에는 주석부분 처럼 DI 컨테이너를 사용해 직접 조회했지만 이제는 스프링 컨테이너를 통해서 스프링빈 조회한다.

2. 스프링 컨테이너 생성 과정

1. 스프링 컨테이너 생성

 new AnnotationConfigApplicationContext(AppConfig.class)
  • 스프링 컨테이너 생성시 설정 클래스 지정해야한다. (AppConfig.class)

2. 스프링 빈 등록

설정 클래스 AppConfig

@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 RateDiscountPolicy();
    }
}
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈 등록
  • @Bean이 스프링 빈
    • 빈 이름은 메서드 이름으로 한다.
    • @Bean(name="") 으로 빈 이름 지정 가능하다.

3. 스프링 빈 의존관계 주입

  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 참고해 의존관계를 주입한다.
  • 생성자를 호출하면서 의존관계 주입이 한번에 된다.
profile
기록과 반복

0개의 댓글