728x90
반응형
상속 관계에 있는 스프링 빈을 조회하는 방법에 대해 알아볼 것이다.
스프링 빈은 부모 타입으로 조회하면 자식 타입도 함께 조회한다. 1번 노드가 최상이 루트 빈인데, 모든 자바 객체의 루트는 Object 타입이기 때문에 1번 부모 빈을 포함한 전체 빈을 조회하고 싶으면 Object타입으로 조회하면 된다.
1. 부모 타입으로 조회 - 자식이 여러개 존재
@Test
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.")
void findBeanByParentTypeDuplicate() {
//DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(DiscountPolicy.class));
}
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
현재 DiscountPolicy에는 rateDiscount, fixDiscount 총 두개의 자식 빈이 있다. 이 두개의 빈을 부모 타입인 DiscoundPolicy로 조회하게 되면 오류가 발생한다.
2. 부모 타입으로 조회 - 자식의 이름 지정
자식이 둘 이상 있을 경우 빈 이름을 지정해서 특정 빈을 조회할 수 있다.
@Test
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 빈 이름을 지정하면 된다.")
void findBeanByParentTypeBeanName() {
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy" , DiscountPolicy.class);
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}
3. 특정 타입으로 조회
@Test
@DisplayName("특정 하위 타입으로 조회")
void findBeanBySubType() {
RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
}
4. 부모 타입으로 모두 조회 - 부모 타입
@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));
}
}
5. 부모 타입으로 모두 조회 - Object
Object타입으로 조회하게 되면 빈에 등록된 스프링과 관련된 객체들이 전부 조회 된다.
@Test
@DisplayName("부모 타입으로 모두 조회하기 - Object")
void findAllBeanByObjectType() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for(String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
만들고 싶은 서비스를 스스로 공부하고 만들어 보면서 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분 혹은 궁금한 점은 언제든지 댓글로 남겨주세요🧐
728x90
반응형
'Backend > Spring' 카테고리의 다른 글
[Spring/Error][해결] Spring-React 통합 빌드 오류 - An input file was expected to be present but it doesn't exist. (0) | 2023.12.25 |
---|---|
[Spring/Error][해결] VSCode jdk 버전 업그레이드하기 (0) | 2023.12.25 |
[Spring] Spring Bean 조회 (0) | 2023.12.22 |
[Spring] IoC Container? DI Container와 Spring Bean이란? (0) | 2023.12.16 |
[Spring/Lombok] @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor (0) | 2023.12.02 |