CS 정리/Spring

스프링 컨테이너와 스프링 빈

tose33 2023. 11. 16. 21:12

빈 이름으로 조회

	@Test
	void findBean() {
		// 이름으로 조회
		Object bean = ac.getBean("memberRepository", MemberRepository.class);
		// 타입으로 조회
		Object bean2 = ac.getBean(MemberRepository.class);
	}
  • 이름이 같은 빈이 두개 이상있거나, 동일한 타입이 두 개 이상이면 덮어 씌어지거나 충돌
    • 반드시 빈의 이름은 유니크하게 짓자
  • 상속 관계의 빈 조회시, 조회 한 빈의 자손은 모두 딸려옴 
    • 따라서 조회한 빈의 자식이 둘 이상이면 중복 오류남 (NoUniqueBeanDefinitionException) 
    • 따라서 빈의 이름으로 조회하면 된다 

 

팩토리에 등록된 모든 빈 이름 조회

AnnotationConfigApplicationContext 에 등록된 모든 빈들의 이름 리턴

@SpringBootTest
class SpringmvcApplicationTests {

   AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

   @Test
   void findApplicationBean() {
      String[] beanDefinitionNames = ac.getBeanDefinitionNames();
      for (String beanDefinitionName : beanDefinitionNames) {
         BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
         // ROLE_APPLICATION : 내가 정의한 빈
         // ROLE_INFRASTRUCTURE : 스프링이 등록한 빈 
         if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println(bean);
         }
      }
   }
}

 

 

BeanFactory 와 ApplicationContext

 

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 빈 관리, 조회 역할 (getBean())
  • ApplicationContext
    • BeanFactory 를 상속받음
  • MessageSource
    • 국제화 기능 
  • EnvironmentCapable
    • 환경 변수, 로컬, 개발, 운영등을 구분해서 처리 
  • ResourceLoader
    • 편리한 리소스 조회 
    • 파일, 클래스패스, 외부 등에서 리소스 편리하게 조회 

 

BeanDefinition

  • 스프링 빈의 메타 정보 
  • 어떤 형식이든 (class든 xml 이든) 빈의 정보는 추상화된 BeanDefinition 이 된다.
  • 스프링은 다양한 형태의 설정 정보를 BeanDefinition 으로 추상화 해서 사용한다

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8