728x90
반응형
앞서 스프링에 등록한 Bean 값들을 조회해 보자
등록한 Bean 정보들
@Configuration
public class AppConfig {
// 여기서 DI를 해줌
// DI를 해줌으로써 역할과 구현이 분리됨.
@Bean //@Bean 입력시 스프링 컨테이너에 등록됨.
//등록시 이름이 등록되는데 해당 이름은 메소드 이름이다. memberService
// Key: memberService, value 객체
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
// memory에서 다른 DB로 변경될 경우 해당 코드만 변경하면 됨.
@Bean
public MemberRepository memberRepository() {
return new MemberMemoryRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(new MemberMemoryRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// FixDiscountPolicy -> RateDiscountPolicy로 변경.
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
bean값 출력
public class AnnotationContextInfo {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name =" + beanDefinitionName + "bean = " + bean);
}
}
@Test
@DisplayName("모든 빈 출력하기")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames){
//Object bean = ac.getBean(beanDefinitionName);
//System.out.println("name =" + beanDefinitionName + "bean = " + bean);
//bean 하나의 메타 definition을 가져온다.
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
// 내가 어플리케이션을 개발하려고 등록한 빈들만 출력
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name =" + beanDefinitionName + "bean = " + bean);
}
}
}
}
findAllBean()
1. getBeanDefinitionNames함수로 정의된 bean들을 가져와 string 배열로 받는다.
2. Object bean = ac.getBean(beanDefinitionName); 빈 오브젝트를 가져온다.
findApplicaiontBean()
1. findAllBean과 다른점은 ROLE_APPLICATION으로 사용자가 정의한 빈만 출력하게 했다.
기본적인 Bean 조회 방법들
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
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.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
public class ApplicationContextBasicFindText {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("타입으로 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
// ac.getBean("xxxxx", MemberService.class)
// 일부러 없는 케이스를 만듬.
assertThrows(NoSuchBeanDefinitionException.class,
()->ac.getBean("xxxxx", MemberService.class));
}
}
728x90
반응형
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] 웹 애플리케이션과 싱글톤1 (0) | 2021.05.05 |
---|---|
[Spring] BeanFactory 와 ApplicationContext (0) | 2021.05.01 |
[Spring] Spring container 와 Spring bean (0) | 2021.04.25 |
[Spring] AppConfig에 Spring 적용해보기 (0) | 2021.04.24 |
[Spring] AppConfig (0) | 2021.04.20 |
댓글