스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법은 다음과 같다.
· ac.getBean(빈 이름, 타입)
· ac.getBean(타입)
위 방법을 통해 스프링 빈을 조회해보도록 하자.(AppConfig 활용)
AppConfig에 등록된 빈들은 아래와 같다.
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean // 스프링 컨테이너에 등록이 됨
public MemberService memberService() {
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy(); // 정액 할인
return new RateDiscountPolicy(); // 정률 할인
}
}
※ 참고로 조회 대상 스프링 빈이 없으면 아래와 같은 예외가 발생한다.
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
● 스프링 빈 조회
스프링 빈을 조회하는 테스트 코드를 작성한다.
ApplicationContextBasicFindTest.java
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.junit.jupiter.api.Assertions.*;
public class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("이름 없이 타입으로만 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("구체 타입으로만 조회")
void findBeanByName2() {
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("빈 이름으로 조회x")
void findByNameX() {
// ac.getBean("xxxx", MemberService.class);
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class));
}
}
총 3가지 방법으로 빈을 조회해보고,
등록되지 않은 빈을 조회했을 때의 테스트 코드도 작성했다.
1. 빈 이름으로 조회
ac.getBean("memberService", MemberService.class)
빈 이름(memberService)과 빈의 타입(MemberService.class)를 통해
해당 빈을 조회했다.
2. 이름 없이 타입으로만 조회
ac.getBean(MemberService.class)
빈 이름을 부여하지 않고, 빈의 타입으로만 조회했다.
3. 구체 타입으로만 조회
ac.getBean("memberService", MemberServiceImpl.class);
빈 이름(memberService)과 빈의 구체 타입(MemberServiceImple.class)를 통해
해당 빈을 조회했다.
* 조회하고자 하는 빈이 없을 경우
- 등록하지 않은 스프링 빈(xxxx)를 조회할 경우
NoSuchBeanDefinitionException 예외처리를 통해 테스트 코드를 진행하도록 했다.
결과는...
모든 테스트 코드가 정상적으로 수행되었다.
'Java > Spring' 카테고리의 다른 글
[Spring] Spring bean(빈) 조회 - 상속 관계 (0) | 2022.01.20 |
---|---|
[Spring] Spring bean(빈) 조회 - 동일한 타입이 둘 이상 (0) | 2022.01.20 |
[Spring] Spring bean(빈) 조회 | 컨테이너에 등록된 모든 빈 조회 (0) | 2022.01.20 |
[Spring] 스프링 컨테이너 생성(@Configuration) | 스프링 빈 등록(@Bean) | 스프링 컨테이너 적용 | 스프링 의존성 주입(DI) (0) | 2022.01.15 |
[Spring] IoC(제어의 역전), DI(의존성 주입), Container(컨테이너) | 프레임워크 VS 라이브러리 (0) | 2022.01.15 |