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