getBean()
을 제공한다.ApplicationContext
를 스프링 컨테이너라고 한다.ApplicationContext
는 인터페이스이다.AppConfig
를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
인터페이스의 구현체@Configuration
public class AppConfig {
@Bean
public AService aService() {
return new AServiceImpl(aRepository());
}
@Bean
public aRepository() {
return new mARepository();
}
}
@Configuration
,@Bean
이란 Annotation을 추가시키는 것을 볼 수 있다.<?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="aService" class="package.package....AServiceImpl">
<constructor-arg name="aRepository" ref="mARepository"/>
</bean>
<bean id="aRepository" class="package.package...mARepository"/>
</beans>
bean
안에 id, class를 작성하면 bean 생성이 된다.constructor-arg
//Annotation
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//XML
GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext("appConfig.xml");
/*1. bean 이름으로 조회*/
AService aService = ac.getBean("aService",AService.class);
/*2. 이름없이 타입으로 조회*/
AService aService = ac.getBean(AService.class);
/*3. 구체 타입으로 조회 -> 좋은 방법은 아니다.*/
AService aService = ac.getBean(AService.class,AServiceImpl.class);
/*4. 조회 실패 NoSuchBeanDefinitionException error*/
Aservice aService = ac.getBean("xxxxx",AService.class);
/*5. 모든 Bean 조회*/
String[] beanNames = ac.getBeanDefinitionNames();
//타입 조회에서 여러개가 조회된다면 NoUniqueBeanDefinitionException Error 발생
//Bean 이름으로 지정해야한다.
/*6. 특정 타입 전부 조회*/
Map<String, AService> beansOfType = ac.getBeansOfType(AService.class);
상속관계에 있는 클래스 중 상위 클래스를 호출 할 경우 그 하위 클래스 까지 전부 호출할 수 있다.
//하위 클래스가 두 개 이상 있을 경우, NoUniqueBeanDefinitionException Error 발생
//따라서 정확힌 Bean 이름을 지정한다면 해당 에러 해결 가능하다.
//상위 클래스 타입으로 하위 클래스 전부 조회
Map<String, AService> beansOfType = ac.getBeansOfType(AService.class);