Что такое IoC-контейнер в Spring Framework?

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

Ответ

IoC-контейнер (контейнер инверсии управления) в Spring — это ядро фреймворка, ответственное за создание, конфигурацию и управление жизненным циклом объектов, называемых бинами (beans), а также за разрешение их зависимостей.

Основные обязанности контейнера:

  1. Создание бинов на основе определений (аннотации, XML, Java-конфигурация).
  2. Внедрение зависимостей (Dependency Injection) между бинами.
  3. Управление жизненным циклом: вызов методов инициализации (@PostConstruct) и уничтожения (@PreDestroy).

Два основных интерфейса контейнера:

  • BeanFactory — базовый контейнер, предоставляющий основные возможности DI.
  • ApplicationContext — расширенный контейнер, наследующий BeanFactory и добавляющий:
    • Интеграцию с AOP (аспектно-ориентированное программирование).
    • Управление событиями (ApplicationEvent).
    • Поддержку интернационализации (i18n).
    • Удобные способы загрузки ресурсов.
    • Наследование контекстов (родительский/дочерний).

Пример работы:

// 1. Контейнер (ApplicationContext) создается при запуске приложения
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// 2. Контейнер создает все бины, описанные в @Configuration-классе AppConfig
// 3. Контейнер внедряет зависимость UserRepository в UserService
UserService service = context.getBean(UserService.class); // Получаем готовый, сконфигурированный бин

Контейнер избавляет разработчика от необходимости писать шаблонный код для создания и связывания объектов.