이전 포스트로 객체지향적으로 외부 앱설정이라는 클레스에서 한 클레스가 부모인터페이서의 어떤 구현체를 사용할것인가를 조립해주는 클레스를 따로 만드었다.
스프링은 이와같은 구조를 내부적으로 잘 정리되게 지원한다 그것이 스프링 컨테이너와 빈이다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy(); //이것만 바꾸면 할인정책변경가능
}
}
@Configuration
어노테이션으로 스프링 컨테이너로 지정될 클레스를 선택하고 @Bean
어노테이션으로 스프링 컨테이너의 빈 저장소로 함수들을 등록할 수 있다.
이런 기본적인 등록이 완료된후에 이전에는 위의 설정을 사용하려면 그냥
//실행함수(main등)
Appconfig appConfig = new Appconfig();
MemberService memberService = appConfig.memberService();
이런식으로 설정 클레스를이용해서 실제로 생성하였다
하지만 스프링 컨테이너를 사용하면
//AppConfig에 어노테이션 추가하면 그쪽 설정들 ApplicationContext저장됨 이제 여기서 가져오는것임
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(
AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService",
MemberService.class);
ApplicationContext
라는 쪽에 저장되어서 여기서 꺼내고 사용할 수 있다. 여기서 설정들을 하나씩 써내쓸 수 있는것이다.
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법은
ac.getBean(빈이름, 타입)
ac.getBean(타입)
정도가 있다.