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