Back-end/spring frameworks

스프링 컨테이너와 빈

Hazel Han 2023. 11. 19. 15:37

구현체가 여러개라면?

만약 OrderService 인터페이스에 대한 구현체가 하나라면, 일반적으로는 구현체의 이름을 OrderServiceImpl이라고 한다. 하지만, 구현체가 여러개라면 각 구현체의 특성에 맞게 이름을 생성한다.

 

 

@BeforeEach

: 테스트 코드 실행 전 반드시 실행되는 것으로, 테스트 코드가 2개면 2번 실행된다.

class MemberServiceTest {

 MemberService memberService;
 
 @BeforeEach
 public void beforeEach() {
 AppConfig appConfig = new AppConfig();
 memberService = appConfig.memberService();
 
 }
}

 

스프링 컨테이너와 빈

스프링 컨테이너

ApplicationContext를 스프링 컨테이너라고 하며, 이것은 인터페이스이다.

스프링 컨테이너 안에 빈 저장소가 있고, 빈 정보를 가져다 사용할 수 있다.

 

스프링 빈

Spring IoC 컨테이너가 관리하는 자바 객체로서 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다.

 

스프링 빈 조회 방법

class ApplicationContextInfoTest {

 AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);

 @Test
 @DisplayName("모든 빈 출력하기")
 void findAllBean() {
 String[] beanDefinitionNames = ac.getBeanDefinitionNames();
 for (String beanDefinitionName : beanDefinitionNames) {
 Object bean = ac.getBean(beanDefinitionName);
 System.out.println("name=" + beanDefinitionName + " object=" +
bean);

 }

 

스프링에 등록된 모든 빈 조회하기

ac.getBean(빈이름, 타입);

조회대상 스프링 빈이 존재하지 않으면, 아래와 같은 에러가 발생한다.

NoSuchBeanDefinitionException: No bean named 'xxxxx' available

 

타입으로 빈 조회하기

ac.getBeansOfType();

위 코드를 사용하면 타입으로 빈을 조회할 수 있는데, 이 때 같은 타입의 빈이 두 개 이상 존재하면 에러가 발생한다.

해결방안 : 각 빈마다 이름을 지정하자.

 

빈 상속

Object 타입으로 빈을 조회하면, 모든 빈을 조회할 수 있다.

class ApplicationContextExtendsFindTest {

 AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(TestConfig.class);

@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));

 }
}