스프링 컨테이너

초보개발·2021년 12월 8일
0

Spring

목록 보기
7/37

스프링 컨테이너

  • ApplicationContext를 스프링 컨테이너라고 한다.
  • 기존에는 AppConfig를 이용해서 직접 객체를 생성하고 DI를 했었지만, 스프링 컨테이너를 통해 사용할 수 있다.
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정(구성) 정보로 사용한다. 여기서 @Bean이 붙은 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 Spring bean이라고 한다.
  • 스프링 빈은 @Bean이 붙은 메서드의 이름을 스프링 빈 이름으로 사용한다.
    • @Bean(name="이름 지정")으로 다른 이름 지정이 가능하다.
  • 전에는 AppConfig를 통해서 직접 조회했으나 스프링 컨테이너를 통해 필요한 스프링 빈(객체)를 찾아야 한다.
    • applicationContext.getBean(name, type) 메서드를 사용해 찾을 수 있다.
  • 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아 사용하도록 변경되었다.

1. 변경된 AppConfig.java

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

2. 변경된 MemberApp, OrderApp

public class MemberApp {

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

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

0개의 댓글