ApplicationContext, 설정 코드, 빈 설정 메타정보

이연희·2022년 7월 5일
0

Spring

목록 보기
63/105
post-custom-banner

BeanFactory와 ApplicationContext

BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 기능이 있다. ApplicationContext는 BeanFactory 기능을 상속받아서 제공한다. ApplicationContext는 빈 관리 기능과 함께 여러 부가 기능(메세지소스 활용한 국제화 기능, 환경변수, 애플리케이션 이벤트, 편리한 리소스 조회)의 인터페이스도 상속받고 있다.

설정 코드

어노테이션 기반 자바 코드 설정은 'new AnnotationConfigApplicationContext(AppConfig.class)'을 사용할 수 있다.
XML 설정을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점이 있다. 'GenericXmlApplicationContext'를 사용하여 'xml' 설정 파일을 넘기면 된다.
아래 xml 코드는 기존의 Appconfig 파일의 빈을 등록하는 것과 같은 역할을 한다.

<bean id="memberService" class = "hello0703.core.member.MemberServiceImpl">
    <constructor-arg name="memberRepository" ref="memberRepository"/>
</bean>
<bean id="memberRepository" class="hello0703.core.member.MemoryMemberRepository"/>

<bean id="orderService" class="hello0703.core.order.OrderServiceImpl">
    <constructor-arg name="memberRepository" ref="memberRepository"/>
    <constructor-arg name="discountPolicy" ref="discountPolicy"/>
</bean>

<bean id="discountPolicy" class="hello0703.core.discount.RateDiscountPolicy"/>
@Configuration
public class AppConfig {//애플리케이션 전체를 설정하고 구성한다.
    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
    @Bean
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

스프링 빈 설정 메타 정보 - BeanDefinition

스프링이 다양한 설정 형식을 지원 가능한 이유는 BeanDefinition 추상화가 있기 때문이다. 추상화에만 의존하도록 설계했다. 역할과 구현을 개념적으로 나눴기 떄문에 XML, 자바 코드 등을 이용해서 BeanDefinition을 만들면 된다. 스프링 컨테이너는 자바코드인지 XML인지 알 필요가 없고, BeanDefinition만 알면 된다. BeanDefinition을 빈 설정 메타정보라고 한다. @Bean, 당 각각 하나씩 메타 정보가 생성된다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

profile
공부기록
post-custom-banner

0개의 댓글