ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너라 한다.ApplicationContext
는 인터페이스이다.AnnotationConfigApplicationContext
는 ApplicationContext
인터페이스의 구현체이다.스프링 컨테이너를 생성할 때 구성 정보를 지정해준다 (예제에서는 AppConfig.class)
스프링 컨테이너는 파라미터로 넘어온 설정 클래스의 정보를 사용하여 스프링 빈을 등록한다.
스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입한다.
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("beanDefinitionName = " + beanDefinitionName + ", object = " + bean);
}
}
}
ac.getBeanDefinitionNames()
: 스프링 컨테이너에 등록된 모든 빈 이름을 조회한다.@Test
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
//Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
//Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("beanDefinitionName = " + beanDefinitionName + ", object = " + bean);
}
}
}
ac.getBeanDefinition()
: 파라미터로 빈 이름을 넘기면 BeanDefinition을 가져올 수 있다.beanDefinition.getRole()
으로 애플리케이션 빈인지 스프링이 사용할 빈인지 확인할 수 있다.void findBeanByname() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
}
Configuration의 메서드 이름이 스프링빈의 이름이 되므로 이를 이용하여 빈을 가져올 수 있다.
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
}
타입으로만 조회하는 경우 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 같은 타입이 존재하는 경우 빈 이름을 지정해야한다.
void findAllBeanByType() {
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
getBeansOfType()
을 이용하여 스프링빈의 이름과 스프링빈을 Map의 key, value로 가져올 수 있다.
getBean()
제공BeanFactory 또는 ApplicationContext를 스프링 컨테이너라 한다
BeanDefinition
이라는 추상화를 통해 다양한 설정 형식을 지원한다.BeanDefinition
을 빈 설정 메타정보라 한다.