ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너
라 한다.
ApplicationContext
는 인터페이스
다. => 다형성이 적용되어있다.
스프링 컨테이너는 XML을 기반으로 만들수 있고(거의 사용 X), 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.
직전에 AppConfig
를 사용했던 방식이 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.
자바 설정 클래스를 기반으로 스프링 컨테이너 ApplicationContext
를 만들어보자.
new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
인터페이스에 구현체이다.더 정확히는 스프링 컨테이너를 부를때
BeanFactory
,ApplicationContext
로 구분해서 이야기한다.
BeanFactory
를 직접 사용하는 경우는 거의 없으므로 일반적으로ApplicationContext
를 스프링 컨테이너라고 한다.
new AnnotationConfigApplicationContext(AppConfig.class)
AppConfig.class
를 구성 정보로 지정했다.스프링 컨테이너는 파라이터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.
@Bean 이름은 default로 메서드 이름을 사용하는데 앞서 언급했던 것 처럼 이름을 직접 부여할 수 있다.
@Bean(name="memberService2")
이때 이름은 unique하게 부여해야한다. 만약 이름이 중복되는 경우 다른 빈이 무시되거나 기존 빈을 덮어써버려서 설정에 따라 오류가 생길 수 있다.
실무에서는 최대한 단순하게, 명확하게 해결해야 좋다.
스프링 컨테이너는 설정 정보를 참고하여 의존관계 주입(DI)을 한다.
단순히 자바 코드를 호출하는 것 같지만, 차이가 있다.
처음에 스프링은 빈을 생성하고, 그 후, DI를 하는 단계가 나누어져 있다.
그런데 편리하게도 이렇게 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 DI도 한번에 처리된다.
즉, 스프링 컨테이너를 생성하고, 설정(구성) 정보를 참고해서 스프링 빈도 등록하고, 의존관계도 설정했다.