Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- pointcut
- springdatajpa
- jpa
- 백준
- QueryDSL
- Android
- Proxy
- JPQL
- java
- http
- Servlet
- 김영한
- 스프링
- Exception
- 알고리즘
- 인프런
- SpringBoot
- 스프링 핵심 원리
- kotlin
- 그리디
- Thymeleaf
- transaction
- Greedy
- AOP
- Spring Boot
- db
- 자바
- spring
- JDBC
- 스프링 핵심 기능
Archives
- Today
- Total
개발자되기 프로젝트
스프링 빈 조회 - 같은 타입의 빈이 여러 개면? 본문
1. 클래스로 빈을 찾았는데 같은 타입의 빈이 여러개면???
- 이름을 지정해주면 된다 ㅋㅋ
- as.getBeansOfType()사용하면 해당 타입의 모든 빈 조회가능
- 중복상황을 만들어 주기 위해 내부 클래스에 SameBeanConfig를 만들어주었다.
- 만약 클래스로 찾았는데 중복된다면 NoUniqueDefinitionException이 발생한다.
public class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생")
void findBeanByTypeDuplicate(){
MemberRepository bean = ac.getBean(MemberRepository.class);
}
@Configuration
static class SameBeanConfig{
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2(){
return new MemoryMemberRepository();
}
}
}
- 중복 발생 시 해당 예외가 터지는지 검증하도록 변경
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생")
void findBeanByTypeDuplicate(){
//MemberRepository bean = ac.getBean(MemberRepository.class);
assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
}
2. 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다!
- ac.getBean(빈 이름, 타입)
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다.")
void findBeanByName(){
MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
3. 특정 타입 모두 조회하기
- ac.getBeansOfType()을 사용하면 된다.
- return 타입은 Map<String, class>로 key & Value 형식이다.
key = 빈 이름, value = 빈 객체
@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));
}
System.out.println("beansOfType = " + beansOfType);
assertThat(beansOfType.size()).isEqualTo(2);
}
- 실행 결과
key = memberRepository value = hello.core.member.MemoryMemberRepository@6622fc65
key = memberRepository2 value = hello.core.member.MemoryMemberRepository@299321e2
beansOfType = {memberRepository=hello.core.member.MemoryMemberRepository@6622fc65, memberRepository2=hello.core.member.MemoryMemberRepository@299321e2}
4. GitHub : 210726 Find Bean
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
BeanFactory와 ApplicationContext (0) | 2021.07.26 |
---|---|
스프링 빈 조회 - 상속관계 (0) | 2021.07.26 |
스프링 빈 조회 - 기본 (0) | 2021.07.26 |
컨테이너에 등록된 빈 조회 (0) | 2021.07.26 |
스프링 컨테이너 생성 (0) | 2021.07.25 |
Comments