AppConfig
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberService memberService(){ ... } @Bean public MemberRepository memberRepository() { ... } @Bean public OrderService orderService(){ ... } @Bean private static DiscountPolicy discouontPolicy() { ... } }
OrderApp
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; ... public class OrderApp(){ ... //apc는 ApplicationContext 인터페이스의 구현체이다. ApplicationContext apc = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = apc.getBean("memberService", MemberService.class); OrderService orderService = apc.getBean("orderService", OrderService.class); ... }
ApplicationContext
를 스프링 컨테이너라 한다. ApplicationContext
은 인터페이스이고 스프링 컨테이너의 최상위 인터페이스인 BeanFactory
를 상속받아서 제공한다.AppConfig
는 애노테이션 기반의 자바 설정 클래스로 만든 것이다.AnnotationConfigApplicationContext
객체를 통해 @Configuration
이 붙은 AppConfig
를 설정 정보로 사용한다. 이때 AppConfig
내부의 @Bean
이 붙은 메서드를 모두 호출해서 반환된 객@Bean
이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하고 이 이름을 인자로 사용하는 applicationContext.getBean("이름", 타입)
메서드로 찾을 수 있다.new AnnotationConfigApplicationContext(AppConfig.class)
를 통해 스프링 컨테이너를 생성해준다. 이때 인자 값으로 구성 정보를 입력해주어야 하는데 이 경우 AppConfig.class
를 구성 정보로 넘겨주었다.AppConfig
의 @Bean
이 붙은 메서드들을 스프링 빈 저장소에 이름과 객체 타입으로 등록한다.AppConfig
를 확인하고 스프링 빈끼리의 의존 관계를 주입한다. 이것을 DI라고 한다.getBean()
)하는 역할을 담당한다.BeanDefinition
이 있다. BeanDefinition
은 스프링 빈의 정보를 추상화한 것으로 빈 설정 메타 정보라 한다. 즉 스프링 빈을 역할과 구현을 개념적으로 나눈 것이라 볼 수 있다.BeanDefinition
을 만들고 스프링 컨테이너는 코드가 무엇인지는 상관하지 않고 BeanDefinition
만 보면 된다.BeanDefinition
을 기반으로 스프링 빈을 생성하게 된다.Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard