@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너라 한다ApplicationContext
는 인터페이스이다. new AnnotationConfigApplicationContext(AppConfig.class);
: AppConfig.class
를 구성 정보로 지정한다.memberService
, memberRepository
, orderService
, orderService
)으로 등록한다.MemberServiceImpl
, MemoryMemberRepository
, OrderServiceImpl
, RateDiscountPolicy
)로 등록한다.beanfind
패키지를 생성하고 ApplicationContextInfoTest
클래스를 생성한다.iter
을 입력하면 for문을 자동으로 완성할 수 있다.soutv
나 soutm
를 통해 System.out.println
을 쉽게 입력할 수 있다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
: 스프링에 등록된 모든 빈 이름을 조회한다.BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
: 빈에 관한 정보(메타 데이터)를 꺼낸다.if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
: 빈이 사용자가 정의한 빈일 시에만 실행한다.getRole()
로 구분할 수 있다.Object bean = ac.getBean(beanDefinitionName);
: 빈 이름으로 빈 객체(인스턴스)를 조회한다.ApplicationContextBasicFindTest
클래스를 생성한다.<코드>
...
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName(){
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
...
}
getBean()
을 통해 찾을 수 있다....
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX(){
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() ->ac.getBean("XXXX", MemberService.class));
}
}
...
assertThrows
은 오류가 발생해야 성공으로 처리한다.getBean()
사용 시)getBeansOfType()
메소드를 사용하면 된다. beanfind
패키지 아래 ApplicationContextSameBeanFindTest
클래스를 추가한다.<코드>
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
void findBeanByTypeDuplicate(){
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(MemberRepository.class));
}
ac.getBean(MemberRepository.class)
를 실행하면, NoUniqueBeanDefinitionException
오류가 발생하여야 한다.Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
: getBeansOfType
메소드는 Map 형식으로 반환한다.Object
타입으로 조회하면 모든 스프링 빈을 조회한다.NoUniqueBeanDefinitionException
오류). 이를 해결하기 위해서는 다음 방법을 사용한다.ApplicationContextExtendsFindTest
클래스를 생성한다.<코드>
BeanFactory
는 스프링 컨테이너의 최상의 인터페이스이며, 스프링 빈에 관한 여러 기능을 제공한다.ApplicationContext
는 BeanFactory
을 상속받는다.XmlAppContext
클래스를 생성한다.<코드>
src.main.resources
밑에appConfig.xml
을 생성한다.<코드>
Appconfig
와 매우 유사하다.<생략>
본 포스팅은 김영한 강사의 스프링 핵심 원리 강의를 수강하고 요약한 것으로, 해당 강의의 영상 및 강의자료를 참고하였습니다.