Spring/spring 기초 스터디
[Spring] Spring Bean 값 조회 하기
p8labs
2021. 4. 28. 21:52
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));
}
}
스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지
지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....
www.inflearn.com
728x90
반응형