본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 스프링 컨테이너와 스프링 빈]자바코드, XML / 스프링 빈 설정 메타 정보 - BeanDefinition

public class XmlAppContext {

    @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.MemberServiceImpl">
        <constructor-arg name="memberRepository" ref="memberRepository" />
    </bean>

    <bean id="memberRepository"
          class="hello.core.member.MemoryMemberRepository" />

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

    <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />

</beans>
스프링 빈과 비교
@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 RateDiscountPolicy();
    }
}

public class BeanDefinitionTest { // BeanDefinitionTest 클래스 정의
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); // Spring의 Annotation 기반 설정을 사용하는 ApplicationContext 생성
    // GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); // XML 파일을 사용한 Spring 설정의 주석 처리된 대안 예시

    @Test // JUnit의 테스트 메소드임을 나타내는 어노테이션
    @DisplayName("빈 설정 메타정보 확인") // 테스트 메소드의 이름을 지정하는 어노테이션
    void findApplicationBean() { // 테스트 메소드 정의
        String[] beanDefinitionNames = ac.getBeanDefinitionNames(); // ApplicationContext에서 관리하는 모든 빈의 이름을 가져옴
        for (String beanDefinitionName : beanDefinitionNames) { // 빈 이름 배열을 반복하며 각 빈 이름에 대하여
            BeanDefinition beanDefinition =
                    ac.getBeanDefinition(beanDefinitionName); // 현재 빈 이름에 해당하는 BeanDefinition을 가져옴
            
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) { // BeanDefinition의 역할이 ROLE_APPLICATION(사용자 정의 빈)인 경우
                System.out.println("beanDefinitionName" + beanDefinitionName +" beanDefinition = " + beanDefinition); // 빈 이름과 빈 정의 정보를 출력
            } 
        }
    }
}