@SpringBootApplication
public class KioskApplication implements CommandLineRunner {
private Kiosk kiosk;
@Autowired
public KioskApplication(Kiosk kiosk) {
this.kiosk = kiosk;
}
public static void main(String[] args) {
SpringApplication.run(KioskApplication.class, args);
}
@Override
public void run(String... args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// (2) 빈 조회
DiscountPolicy discountPolicy = applicationContext.getBean("discountPolicy", DiscountPolicy.class);
Printer printer = applicationContext.getBean("printer", Printer.class);
Kiosk kiosk_check = applicationContext.getBean("kiosk", Kiosk.class);
--- 생략 ---
(1) 스프링 컨테이너 생성
앞에서 프로그램을 스프링 전환하는 과정에서 간략하게 언급했던 것처럼, ApplicationContext 인터페이스를 일반적으로 스프링 컨테이너라고 부릅니다.
좀 더 정확하게는 스프링 컨테이너를 말할 때 ApplicationContext가 상속하고 있는 BeanFactory와 구분해서 사용하지만, BeanFactory를 직접 사용하는 경우는 거의 없기 때문에 일반적으로 ApplicationContext를 스프링 컨테이너라 합니다.

참고로, BeanFactory는 스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리하고 조회하는 역할을 담당합니다. 곧 뒤에서 보게 될 getBean() 메서드를 제공하는 주체도 바로 BeanFactory입니다.
그렇다면 BeanFactory 인터페이스를 상속하고 있는 ApplicationContext는 BeanFactory와 무엇이 다
를까요?

여러분들의 인텔리제이에서 ApplicationContext 인터페이스에 대한 정보를 찾아보면, 이 사실을 직접 확인할 수 있습니다.
위의 그림에서 확인할 수 있는 것처럼 ApplicationContext는 BeanFactory로부터 확장된 인터페이스뿐만 아니라 EnvironmentCapable, MessageSource, ApplicationEventPublisher, ResourcePatternResolver 등 다양한 기능의 인터페이스들을 상속받아 사용하고 있습니다. 이러한 인터페이스들은 환경 변수 설정, 메시지 국제화 기능, 이벤트 발생, 리소스 조회 등 다양한 기능들을 지원합니다.
정리하면, ApplicationContext는 빈을 관리하고 조회하는 기능뿐 아니라 웹 애플리케이션을 개발하는 데 필요한 다양한 부가 기능들을 함께 제공합니다.
빈 조회 - getBean(빈 이름, 타입)
DiscountPolicy discountPolicy = applicationContext.getBean("discountPolicy", DiscountPolicy.class);
참고로, 필요에 따라서 아래와 같이 빈의 이름을 다르게 설정해 줄 수도 있습니다.
@Configuration
public class AppConfig {
@Bean(name="discountPolicy2")
public DiscountPolicy discountPolicy() {
return new FixedAmountDiscountPolicy(100); // 할인 금액을 여기서 설정
}
만약 위와 같은 방식으로 빈의 이름을 등록해 줄 시, 같은 이름의 빈이 등록되는 경우 에러의 원인이 되므로, 항상 다른 이름의 빈을 생성하도록 각별히 주의해야 합니다.
가장 기본적인 빈 조회 방법은 다음과 같습니다.
applicationContext.getBean("discountPolicy", DiscountPolicy.class);applicationContext.getBean(DiscountPolicy.class);