[Spring] 스프링 컨테이너, BeanFactory , ApplicationContext, BeanDefinition
AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
//return new FixDiscountPolicy()
}
}
- @Configuration : 설정 정보라는 것을 의미
- @Bean : @Bean을 붙이면 스프링 컨테이너에 Bean으로 등록됨
public class MemberApp {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = ac.getBean("memberService", MemberService.class);
Member member = new Member(1, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
}
}
스프링 컨테이너
- 위에서 사용한 ApplicationContext가 스프링 컨테이너임
- ApplicationContext는 인터페이스임
- 스프링 컨테이너는 AppConfig처럼 애플리케이션의 제어권을 가지고 의존관계 주입을 해주는 역할을 함
- @Configutation이 붙은 AppConfig를 어플리케이션의 설정 정보로 활용하여 Bean을 등록하고 의존관계를 형성함
- @Bean이 붙은 메서드의 메서드 명을 Bean이름으로 등록함 (빈 이름은 각각 달라야 함)
- getBean() 메서드로 스프링 컨테이너에 등록된 Bean을 찾아올 수 있음
- getBean(빈 이름, 타입) / getBean(타입)
BeanFactory <- ApplicationContext <- AnnotationConfigApplicationContext(Java설정 클래스 사용)
<- GeneralXmlApplicationContext(XML 설정 파일 사용)
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- Bean관리, 조회, getBean() 메서드 제공
ApplicationContext
- BeanFactory + 부가기능
BeanDefinition
- xml, java설정 정보를 활용하여 BeanDefinition을 만듦
- 스프링 컨테이너는 BeanDefinition을 보고 Bean을 등록함 => 스프링 컨테이너는 설정 정보가 xml인지, java인지 몰라도도 되고 BeanDefinition에만 의존함