@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와 매우 유사하다.<생략>
본 포스팅은 김영한 강사의 스프링 핵심 원리 강의를 수강하고 요약한 것으로, 해당 강의의 영상 및 강의자료를 참고하였습니다.