Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.
예시 그림

AppConfig.class, 이외에 테스트코드 작성할 때 @Configuration 애노테이션 사용했던 것들new AnnotationConfigApplicationContext(AppConfig.class)GenericXmlApplicationContext를 사용하면서 xml 설정 정보를 넘기면 된다.Xml 설정 자바 코드
import static org.assertj.core.api.Assertions.*;
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
GenericXmlApplicationContext()에 xml 설정 정보를 넘기면된다.appConfig.xml
<?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>
AppConfig자바코드를 그대로 xml로 변경한것이다.BeanDefinition이라는 추상화가 존재한다.BeanDefinition을 빈 설정 메타정보라고 한다.@bean, <bean> 빈 하나당 각각 하나씩 메타정보가 생성된다.
코드 레벨

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용하여 AppConfig.class 를 읽고 BeanDefinition을 생성한다.
AnnotationConfigApplicationContext 내부 코드를 살펴보자public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {
private final AnnotatedBeanDefinitionReader reader;
}
보면 설정 정보를 읽어들이는 AnnotatedBeanDefinitionReader가 존재한다. 이름 그대로 애노테이션 형식으로 작성된 코드를 읽어들여서 BeanDefinition을 만들어내는 역할을 한다.
Xml이나 직접만든 설정 정보도 같은 방식으로 동작한다.
빈 설정 정보 확인 자바 코드
public class BeanDefinitionTest {
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) {
System.out.println("beanDefinitionName = " + beanDefinitionName +
" beanDefinition = " + beanDefinition);
}
}
}
}
beanDefinitionName, getRole() 나왔는데 기억 안나면 앞 게시글 다시 와보도록 하자.출력 결과

출력 정보
BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수도 있다.BeanDefinition을 직접 정의하거나 사용할 일은 거의 존재하지 않는다.AnnotationConfigApplicationContext는 팩토리 메서드를 통해서 등록하는 방법이다.