

getBean()을 제공한다.

AnnotationConfigApplicationContext도 그런 구현체 중 하나.new AnnotationConfigApplicationContext(AppConfig.class)AnnotationConfigApplicationContext클래스를 사용하면서 자바 코드로 된 설정 정보를 넘기면 된다.GenericXmlApplicationContext를 사용하면서 xml설정 파일을 넘기면 된다.public class XmlAppContextTest {
    @Test
    void xmlAppContext() {
        ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="memberService" class="hello.core.member.service.MemberServiceImpl" >
        <constructor-arg name="memberRepository" ref="memberRepository"/>
    </bean>
    <bean id="memberRepository" class="hello.core.member.repository.MemoryMemberRepository"/>
    <bean id="orderService" class="hello.core.order.service.OrderServiceImpl" >
        <constructor-arg name="memberRepository" ref="memberRepository"/>
        <constructor-arg name="discountPolicy" ref="discountPolicy"/>
    </bean>
    <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy"/>
</beans>
스프링이 이렇게나 유연합니다.
BeanDefinition이라는 추상화가 있다.BeanDefinition을 빈 설정 메타정보라 한다.@Bean, <bean> 강 각각 하나씩 메타 정보가 생성된다.
코드레벨로 조금 더 깊이있게 들어가보자.

AnnotationConfigApplicationContext는 AnnotationBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성한다.GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition을 생성한다.BeanDefinition을 생성하면 된다.