Что такое контейнер Spring (ApplicationContext)?

«Что такое контейнер Spring (ApplicationContext)?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Контейнер Spring (Spring IoC Container) — это ядро фреймворка, отвечающее за создание объектов (бинов), управление их жизненным циклом, конфигурацию и связывание зависимостей между ними (Dependency Injection).

Основные реализации:

  1. BeanFactory — базовый интерфейс, предоставляет минимальную функциональность для управления бинами.
  2. ApplicationContext — расширяет BeanFactory, добавляя enterprise-функции:
    • Интеграцию с AOP
    • Управление событиями (ApplicationEvent)
    • Интернационализацию (i18n)
    • Загрузку ресурсов
    • Объявление бинов через аннотации (@Component, @Service и др.)

Как это работает:

  1. Контейнер читает конфигурацию (XML, Java-конфиг, аннотации).
  2. Создает граф объектов, разрешая зависимости (например, внедряет UserService в UserController).
  3. Управляет бинами от создания до уничтожения, вызывая callback-методы (например, @PostConstruct).

Пример создания и использования:

// Конфигурация с аннотациями
@Configuration
@ComponentScan("com.example")
public class AppConfig { }

// Создание контейнера
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// Получение бина из контейнера
UserService userService = context.getBean(UserService.class);
userService.process(); // Бин и его зависимости уже настроены контейнером

Жизненный цикл бина: Instantiation → Population of properties → BeanNameAware → BeanFactoryAware → @PostConstruct → InitializingBean → Бин готов → @PreDestroy → DisposableBean. Контейнер инвертирует контроль: не приложение создает зависимости, а контейнер предоставляет их приложению (Inversion of Control).