ApplicationContext
를 스프링 컨테이너라고 한다.ApplicationContext
는 인터페이스이다. AppConfig
를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 사용한다.@Configuration
이 붙은 AppConfig
를 설정(구성) 정보로 사용한다. 여기서 @Bean
이라고 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈(Bean)이라고 한다.@Bean
이 붙은 메서드명을 스프링 빈의 이름으로 사용한다.memberService
, orderService
)AppConfig
를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다.applicationContext.getBean()
메서드를 사용해서 찾을 수 있다.// 스프링 컨테이너 생성
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
@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();
}
ac.getBeanDefinitionNames()
: 스프링에 등록된 모든 빈 이름을 조회ac.getBean()
: 빈 이름으로 빈 객체(인스턴스)를 조회getRole()
로 구분할 수 있다.ROLE_APPLICATION
: 일반적으로 사용자가 정의한 빈ROLE_INFRASTRUCTURE
: 스프링이 내부에서 사용하는 빈스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법
ac.getBean(빈이름, 타입)
ac.getBean(타입)
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
참고: 구체 타입으로 조회하면 변경 시 유연성이 떨어진다.
ac.getBeansOfType()
을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.Object
타입으로 조회하면, 모든 스프링 빈을 조회한다.getBean()
을 제공한다.BeanFactory와의 차이점
은?정리
- ApplicationContext는 BeanFactory의 기능을 상속받는다.
- ApplicationContext는 빈 관리 기능 + 편리한 부가 기능을 제공한다.
- BeanFactory나 ApplicationContext를 스프링 컨테이너라고 하며, 부가기능이 포함된 ApplicationContext를 주로 사용한다.
new AnnotationConfigApplicationContext(AppConfig.class)
AnnotationConfigApplicationContext
클래스를 사용하면서 자바 코드로 된 설정 정보를 넘기면 된다.GenericXmlApplicationContext
를 사용하면서 xml
설정 파일을 넘기면 된다.XmlAppConfig 사용 자바 코드
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
}
}
xml 기반의 스프링 빈 설정 정보
src/main/resources/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>
</beans>
스프링은 다양한 형태의 설정 정보를 BeanDefinition
으로 추상화해서 사용한다.
역할과 구현을 개념적으로 나눈 것이다.
BeanDefinition
을 빈 설정 메타정보라고 한다.
@Bean
, <bean>
당 각각 하나씩 메타 정보가 생성된다.스프링 컨테이너는 이 메타 정보를 기반으로 스프링 빈을 생성한다.
AnnotationConfigApplicationContext
는 AnnotatedBeanDefinitionReader
를 사용해서 AppConfig.class
를 읽고 BeanDefinition
을 생성한다.
GenericXmlApplicationContext
는 XmlBeanDefinitionReader
를 사용해서 appConfig.xml
설정 정보를 읽고 BeanDefinition
을 생성한다.
새로운 형식의 설정 정보가 추가되면, ~~BeanDefinitionReader를 만들어서 BeanDefinition
을 생성하면 된다.