ApplicationContext ac =
new AnnotationConfigApplicationContext(AppConfig.class);
스프링 컨테이너는 빈을 생성하고, 의존관계를 주입하는 두가지 단계가 나누어져있다. 하지만 생성자 주입을 하면 생성자 호출과 동시에 의존관계 주입도 한번에 처리된다.
String[] beans = ac.getBeabDefinitionNames();
for(String beanName : beans){
Object bean = ac.getBean(beanName);
System.out.println(bean);
}
BeanDefinition beanDefinition = ac.getBeanDefinition(beanName);
//ROLE_APPLICATION 직접 등록한 빈
//ROLE_INFRASTRUCTURE 스프링이 내부에서 사용하는 빈
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanName);
System.out.println(bean);
}
MemberService memberService = ac.getBean("memberService",MemberService.class);
ac.getBean(이름, 타입)으로 빈을 조회할 수 있지만 이전의 코드에선 ac.getBean(이름) 으로 출력을 했다. 이것의 차이점은 getBean(이름)으로 사용시 Object 타입이 반환되기 때문에 타입캐스팅을 해줘야 한다.
MemberService memberService = ac.getBean("memberService"); // 타입오류 Object object = ac.getBean("memberService"); // 정상작동 MemberService memberService = (MemberService) ac.getBean("memberService"); // 타입 캐스팅을 해야한다
MemberService memberService = ac.getBean(MemberService.class);
assertThrows(NoUniqueBeanDefinitionException.class,
()->ac.getBean(MemberRepository.class));
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = "+ key + " value = "+beansOfType.get(key));
}
// 부모타입으로 조회 시 자식타입도 함께 조회된다.
// 자식이 여러개일경우 에러가 발생한다.
assertThrows(NoUniqueBeanDefinitionException.class,
() ->ac.getBean(DiscountPolicy.class));
// 부모타입으로 모두 조회하기
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
for(String key : beansOfType.keySet()){
System.out.println(beansOfType.get(key));
}