paranjong

[Spring] @Configuration, @Bean 본문

Development Study/Spring Framework

[Spring] @Configuration, @Bean

paranjong 2022. 9. 25. 15:50

스프링 컨테이너

//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • ApplicationContext를 스프링 컨테이너라 한다.
  • ApplicationContext는 인터페이스이다.
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설저 클래스로 만들 수 있다.
  • 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 예시는 아래와 같다.
//자바 설정 클래스 기반 스프링 컨테이너  
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • AnnotationConfigApplicationContext 클래스는 ApplicationContext 인터페이스의 구현체이다.
  • 스프링 컨테이너 생성
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
  • 스프링 컨테이너는 설정 정보를 참조하여 의존관계를 주입(DI)한다.
  • 참고
    • 스프링 빈을 생성하고, 의존관계를 주입하는 단계가 나뉘어짐.
    • 자바코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리됨.

빈 이름

  • 빈 이름은 메서드 이름을 사용한다.
  • 빈 이름을 직접 부여할 수도 있다.
    • @Bean(name="memberService2")
    • 빈이름은 항상 다른 이름을 부여해야함.!!

 

AppConfig 스프링 기반으로 변경

@Configuration //설정을 구성
  public class AppConfig {
      @Bean // 스프링 컨테이너에 스프링 빈 등록
      public MemberService memberService() {
          return new MemberServiceImpl(memberRepository());
      }
      @Bean
      public OrderService orderService() {
          return new OrderServiceImpl(
                  memberRepository(),
                  discountPolicy());
}
      @Bean
      public MemberRepository memberRepository() {
          return new MemoryMemberRepository();
      }
      @Bean
      public DiscountPolicy discountPolicy() {
          return new RateDiscountPolicy();
      }
}
  • 스프링 컨테이너는 @Configurattion이 붙은 AppConfig를 설정(구성) 정보로 사용한다.
  • @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 
    • 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
    • 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.

MemberApp 스프링 기반으로 변경

//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

스프링 컨테이너를 통해서 필요한 스프링 빈을 찾아야 한다. 스프링 빈은 ApplcationContext.getBean()메서드를 사용해서 찾을 수 있다.

Comments