== 스프링 컨테이너
ApplicationContext는 BeanFactory 인터페이스
의 하위 인터페이스 -> 즉 ApplicationContext는 BeanFactory에 부가기능을 추가한 것
BeanFactory는 스프링 컨테이너의 최상위 인터페이스 -> 스프링 빈을 관리하고 조회하는 역할
보통 ApplicationContext
는 BeanFactory + 부가 기능을 가지기에 자주 사용
ApplicationContext
의 구현체(인터페이스를 구현한 클래스)는 여러가지가 있는데, 구현체에 따라 스프링 컨테이너를 XML
을 기반으로 만들수도 있고, 자바 클래스
로 만들 수도 있다!
-> 빈 등록을 BeanDefinition
으로 추상화해서 사용하기 때문에 두 타입중 어느 타입으로 해도 BeanDefinition이 생성
스프링 컨테이너 내부에는 빈 저장소가 존재 -> Key
: Bean name, Value
: Bean Object
스프링 컨테이너는 기본적으로 빈을 싱글톤으로 관리 해준다 -> 싱글톤 컨테이너
라고 불리기도 함
기존 싱글턴 패턴의 문제점(패턴 구현을 위한 코드 추가, 유연성이 떨어짐)은 없어지고, 장점(인스턴스를 생성할 수 없이 단 하나만 생성해서 비용을 줄일수 있다)
@Configuration
public class AppConfig{
@Bean
public StationService stationService(){
return new StationServiceImpl(stationRepository());
}
@Bean
public StationRepository stationRepository(){
return new MemoryStationRepository();
}
@Bean
// ...
}
new AnnotationConfigApplicationContext()를 통해 자바 기반 스프링 컨테이너를 만들어 줌
-> Bean 저장소가 생김(자바 설정 클래스를 파라미터로 넘겨줘서 생성)
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
사용할 땐, 빈 등록 메서드 이름을 통해 객체 가져올 수 있다
StationService stationservice = ac.getBean("stationService", StationService.class);