전 게시물에서 만들었던 AppConfig 같이 객체를 생성하고 관리하며 의존관계를 주입해주는 것을 IoC 컨테이너(Inversion of Control)라고 한다. 그 중에서도 스프링 프레임워크에서는 스프링 컨테이너 라고 한다.
1.스프링 컨테이너 생성
@Configuration // 구성정보를 지정하는 어노테이션
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(
memberRepository()
);
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(
memberRepository(),discountPolicy()
);
}
@Bean
public DiscountPolicy discountPolicy(){
return new FixDiscountPolicy();
// return new RateDiscountPolicy();
}
}
2.스프링 빈 등록
빈 이름 = 메서드이름
직접 등록할 경우 : @Bean(name="memberService2")
ApplicationContext applicationContext=
new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService =
applicationContext.getBean("memberService", MemberService.class);
3.스프링 빈 의존관계 설정 - 준비
4.스프링 빈 의존관계 설정 - 완료
String[] beanDefinitionNames= ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
ac.getBeanDefinitionNames() 스프링에 등록된 모든 빈 이름 조회
ac.getBean() 빈 이름으로 빈 객체 조회
**스프링 빈 조회의 기본 방법**
ac.getBean(빈이름,타입)
ac.getBean(타입)
조회 대상 없을 경우 : NoSuchBeanDefinitionException
MemberService memberService = ac.getBean(MemberService.class);
MemberService memberService = ac.getBean("memberService",
MemberServiceImpl.class);
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxxx",MemberServiceImpl.class));
ac.getBeansOfType() : 모든 빈을 조회
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key+"value"+beansOfType.get(key));
}