개발일기장

Spring 공부 02. 스프링 컨테이너 본문

Spring Boot

Spring 공부 02. 스프링 컨테이너

게슬 2023. 7. 1. 17:48
728x90

https://tlqckd0.tistory.com/93

 

Spring 공부 01. Configuration, Bean

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 이거 사용해서 Config 를 등록 할 수 있다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.

tlqckd0.tistory.com

 

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// ApplicationContext <- 이게 Spring Container임.

Bean의 이름은 항상 다른 이름을 부여해야 한다.


1. Bean 조회 (기본)

    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanByName(){
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

이름 + Class로 조회할 수 있다.

    @Test
    @DisplayName("빈 타입으로 조회")
    void findBeanByType(){
        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

Type만으로도 조회할 수 있지만 같은 type이 2개 이상 등록되어 있으면 안된다

    @Test
    @DisplayName("구체 구체 타입으로 조회")
    void findBeanByName2(){
        MemberService memberService = ac.getBean("memberService",MemberServiceImpl.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

Interface가 아닌 구체 class로도 조회할 수 있다.


2. 모든 Bean 조회

    @Test
    @DisplayName("Application 빈 출력하기")
    void findApplicationBean(){
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();

        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            // ROLE_APPLICATION     -> 사용자가 등록한 BEAN
            // ROLE_INFRASTRUCTURE  -> SPRING 내부에서 사용하는 BEAN

            if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + " object = " + bean);
            }

        }
    }

이렇게 조회 할 수 있다.


3. 문제가 발생하는 상황

    @Test
    @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류 발생")
    void findBeanByTypeDuplicate(){
         Assertions.assertThrows(NoUniqueBeanDefinitionException.class ,
                 ()-> {
                     ac.getBean(MemberRepository.class);
                 });
    }

bean이름이 unique하지 않거나, 이름은 다른데 class type으로 호출했을 때 2개 이상 등록 된 경우 unique exception 발

 

    @Test
    @DisplayName("특정 타입을 모두 조회하기")
    void findAllBeanByType(){
        Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
        for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " + beansOfType.get(key));
        }
        assertThat(beansOfType.size()).isEqualTo(2);
    }

특정 type을 전부 조회할 수 있다.


 

4. class의 위치를 읽기

ResourceLoader같은게 있는데 이거는 spring의 resource 파일을 읽기 위한..?그런거임

근대 그냥 파일 읽어주는 놈 같음

실제로는 저거 확인하는 용도 같지만

 

    @Test
    @DisplayName("빈 Class의 파일 위치 확인")
    void findBeanClassPath() throws IOException {
        Resource resource = resourceLoader.getResource("../java/hello/core/AppConfig.java");
        System.out.println("resource = " + resource.getURI().getPath());
        System.out.println("resource = " + resource.getFilename());
    }

그냥 상위폴더로 가서 class를 확인 할 수도 있는듯

 

## 이거는 내용 추가하기 

728x90

'Spring Boot' 카테고리의 다른 글

Spring 공부 05. Bean Life Cycle  (0) 2023.07.10
Spring 공부 04. 의존관계주입  (0) 2023.07.05
Spring 공부 03. @Bean주입  (0) 2023.07.04
Spring 공부 01. Configuration, Bean  (0) 2023.06.28
MyBatis - Spring 설정  (0) 2022.06.02
Comments