Spring Been 조회 - 상속관계(9)
Spring Container에서 Been을 조회하는 테스트 클래스
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
- AnnotationConfigApplicaionContext 객체를 생성하고 TestConfig클래스를 파라미터로 전달하여 컨테이너를 초기화한다. (빈을 등록시키는 과정)
@Configuration
- 내부 클래스인 TestConfig 클래스에서 사용되는 어노테이션으로 @Bean어노테이션으로 rateDiscountPolicy(), fixDiscountPolicy()메서드는 해당 타입의 빈을 생성하고 반환한다.
부모타입으로 조회시 자식이 둘이상 있으면 중복 오류가 발생한다.
public class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Configuration
static class TestConfig{
@Bean
public DiscountPolicy rateDiscountPolicy(){
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy(){
return new FixDiscountPolicy();
}
}
@Test
@DisplayName("부모 타입으로 조회, 자식이 둘이상 있으면 중복 오류발생")
void findBeanByParentTypeDuplicate(){
DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
assertThrows(NoUniqueBeanDefinitionException.class, ()-> ac.getBean(DiscountPolicy.class));
}
findBeanByParentTypeDuplicate : 부모 타입으로 조회했을 때 같은 타입의 자식 빈이 여러 개 있다면 중복오류를 발생시키는지에 대한 테스트로 ac.getBean(DiscountPolicy.class)를 호출하여 부모 타입의 DiscountPolicy빈을 가져와 NoUniqueBeanDefinitionException이 발생해야 테스트에서 통과된다.
부모타입으로 조회했을때 같은 타입의 빈(자식)이 여러개 있으면 빈이름을 지정하여 조회할 수 있는지 테스트
@Test
@DisplayName("부모 타입으로 조회, 자식이 둘이상 있으면 빈이름을 지정하면 된다.")
void findBeanByParentTypeBeanName(){
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
ac.getBean(DiscountPolicy.class)를 호출했을 때 NoUniqueBeanDefinitionException이 발생하는지 테스트
특정하위타입으로 조회하는 테스트
@Test
@DisplayName("특정 하위 타입으로 조회")
void findBeanBySubType(){
RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
}
ac.getBean(RateDiscountPolicy.class)를 호출하여 RateDiscountPolicy타입의 빈을 가져와 조회하는 테스트
부모타입으로 모든 빈을 조회하는 테스트
@Test
@DisplayName("부모타입으로 모두 조회하기")
void findAllBeanByParentType(){
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
assertThat(beansOfType.size()).isEqualTo(2);
for(String key : beansOfType.keySet()){
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
ac.getBeanOfType(DiscountPolicy.class)를 호출하여 부모 타입인 DiscountPolicy의 모든 빈을 가져와 Map<String, DiscountPolicy>형태로 키 = 이름, 값 = 빈의 인스턴스로 반환한다.
beanOfType.size()가 2와 일치하는지 확인한후 Map의 키와 값을 출력한다.
**Map : Java컬렉션으로 key-value 형태의 쌍으로 데이터를 저장하는 자료구조. 키를 통해 값을 검색할 수 있다.
Object타입으로 모든 빈을 조회하는 테스트
@Test
@DisplayName("부모타입으로 모두 조회하기 - Object")
void findAllBeanObjectType(){
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for(String key : beansOfType.keySet()){
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
Object타입으로 모든 빈을 조회하는 테스트로 ac.getBeansOfType(Object.class)를 호출하여 모든 빈을 가져온다. 반환되는 값은 Map<String, Object>로 key = 빈의 이름 value = 빈의 인스턴스로 반환된다. Object타입은 모든 자바객체의 상위 클래스에 해당하기 때문에 모든 Been을 조회하는것이 가능하다.