AR삽질러

Spring Been 조회 - 상속관계(9) 본문

JAVA/Spring

Spring Been 조회 - 상속관계(9)

아랑팡팡 2023. 7. 16. 15:58
728x90

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을 조회하는것이 가능하다.

728x90
반응형
LIST

'JAVA > Spring' 카테고리의 다른 글

Spring Singleton, SingletionContainer (11)  (0) 2023.08.05
Spring BeenFactory와 ApplicationContext(10)  (0) 2023.08.04
Spring springBeen조회(8)  (0) 2023.07.16
Spring springBeen과 springContainer(7)  (0) 2023.07.15
Spring-기본예제-> Spring(6)  (0) 2023.07.03