※ 본 포스팅은 21.10.14에 게시된 글을 이전한 것 입니다.
1. 스프링 빈 조회
1) 모든 빈 조회
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
~
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("Name = " + beanDefinitionName+" object = "+bean);
}
.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회
.getBean(beanDefinitionName) : 빈 이름으로 빈 객체를 조회
2) 애플리케이션 빈 조회
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
System.out.println("Name = " + beanDefinitionName+" object = "+bean);
}
}
.getRole() : 빈 구분 용도
- 스프링이 내부에서 사용하는 빈( ROLE_INFRASTRUCTURE)
- 직접 등록한 애플리케이션 빈( ROLE_APPLICATION)
.getBeanDefinition: 빈 이름으로 빈 메타데이터 정보 조회
- 모든 빈 이름을 조회한 다음 해당 이름으로 빈 메타데이터를 조회
- 가져온 메타데이터를 통해 빈의 성격을 확인해서 내가 원하는 빈 이면 빈 이름으로 빈 객체를 조회한다.
3) 빈 조회
//getBean(빈이름,타입)
MemberService memberService = ac.getBean("memberService", MemberService.class);
//getBean(타입)
MemberService memberService = ac.getBean( MemberService.class);
//만약 원하는 빈이 없다면 하위 문구가 뜬다.
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
구체 타입 조회 가능
단, "MemberService.class -> MemberServiceImpl.class" 변경 시 유연성이 떨어진다는 단점이 있다.
4) 타입으로 조회
.getBean()으로 특정 타입을 조회했는데 같은 타입이 2개 이상 있으면 오류 발생, 이름을 지정해 주면 오류가 사라진다.
.getBeansOfType() : 해당 타입의 모든 빈을 조회할 수 있다.
//특정타입 모두 조회
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = "+beansOfType.get(key));
}
2. 스프링 빈 상속관계
- 부모 타입으로 조회하면 자식 타입도 함께 조회한다. : 대원칙
- 그래서 모든 자바 객체의 부모 타입인 Object로 조회하면 모든 스프링 빈을 조회한다.
3.BeanFactory와 ApplicationContext
1) 관계도
BeanFactory: 스프링 컨테이너의 최상위 인터페이스 / 스프링 빈을 관리 및 조회하는 역할 담당 / getBean()을 제공함 / 대부분 위에서 사용한 기능은 여기서 제공하는 기능
ApplicationContext:BeanFactory 기능을 모두 상속받아서 제공 / 수많은 부가기능을 제공
4. 스프링 빈 설정 메타정보 : BeanDefinition
1) BeanDefinition 이란?
이전 포스팅에서도 말했다시피 스프링은 XML이나 자바 코드로도 스프링 컨테이너에 등록이 가능하다.
이렇게 다양한 설정 형식을 지원하는 데에는 BeanDefinition이라는 추상화가 중심에 있다.
쉽게 설명해서 역할과 구현을 개념적으로 나눈 것이다.
→ 스프링 컨테이너는 자바 코드 인지 xml 인지 상관없이 오직 BeanDefinition만 알면 된다. : BeanDefinition이 구현
※@Bean(자바 코드) /<bean>(xml) 당 각각 하나씩 메타정보가 생성된다.
빈 메타정보 생성과정(코드 기반)
2) BeanDefinition 정보
우리가 실제로 코딩할 때는 직접 정의하거나 사용할 일은 거의 없다!! 그냥 이러한 흐름을 이해하는 정도로 넘어가면 된다.
Uploaded by N2T
'📑 개발 이론 > 🌱 SPRING' 카테고리의 다른 글
스프링 핵심 원리 - 컴포넌트 스캔 (0) | 2023.06.26 |
---|---|
스프링 핵심 원리 - 싱글톤 (0) | 2023.06.17 |
스프링 핵심 원리 - 스프링 컨테이너 (0) | 2023.06.17 |
스프링 핵심 원리 - 객체지향 원리 적용 정리 (0) | 2023.06.17 |
[스프링 핵심원리] OCP와 DIP (0) | 2023.04.18 |