ApplicaiotnContext를 스프링 컨테이너라 한다. 스프링 컨테이너는 @Configuration이 붙은 클래스를 설정 정보로 사용하고, 해당 클래스 내에 @Bean 어노테이션이 붙은 메서드들을 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
스프링 빈은 @Bean 애노테이션이 붙은 메서드의 명을 그대로 가져와 스프링 빈의 이름으로 등록한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 조회할 수 있다.
@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();
}
}
public class MemberApp {
public static void main(String[] args) {
//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
//스프링 Bean 조회
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
...
}
}
BeanFactory는 스프링 컨테이너의 최상위 인터페이스이고, 스프링 빈을 관리하고 조회하는 역할을 담당한다.
ApplicationContext는 BeanFactory를 상속받아서 BeanFactory의 모든 기능을 제공함과 동시에 추가적으로 여러 부가기능 을 제공한다. (ex: 메시지소스를 활용한 국제화 기능, 환경변수, 애플리케이션 이벤트, 편리한 리소스 조회 등)