Что такое ApplicationContext в Spring Framework?

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

Ответ

ApplicationContext (контекст приложения) — это центральный интерфейс в Spring, который представляет собой контейнер IoC (Inversion of Control). Он отвечает за инстанцирование, конфигурацию и сборку объектов приложения (бинов), управление их жизненным циклом и внедрение зависимостей между ними.

ApplicationContext является расширением более простого интерфейса BeanFactory, добавляя следующие возможности:

  • Интеграция с AOP (аспектно-ориентированным программированием).
  • Управление ресурсами (ResourceLoader) для удобной работы с файлами, URL и т.д.
  • Публикация и обработка событий (ApplicationEventPublisher).
  • Поддержка интернационализации (i18n) сообщений.
  • Наследование контекстов (родительский-дочерний).
  • Автоматическое обнаружение и регистрация бинов через аннотации (@ComponentScan).

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

  • AnnotationConfigApplicationContext: Для конфигурации на Java-классах с аннотациями (@Configuration).
  • ClassPathXmlApplicationContext: Для конфигурации через XML-файлы, загружаемые из classpath.
  • FileSystemXmlApplicationContext: Аналогично предыдущему, но XML загружается из файловой системы.
  • WebApplicationContext: Специализированный контекст для веб-приложений (используется в Spring MVC).

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

// 1. Создание контекста из Java-конфигурации
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// 2. Получение бина по типу (рекомендуемый способ)
UserService userService = context.getBean(UserService.class);

// 3. Получение бина по имени и типу
DataSource dataSource = context.getBean("primaryDataSource", DataSource.class);

// 4. Проверка существования бина
boolean exists = context.containsBean("myBean");

// 5. Получение всех бинов определенного типа
Map<String, Validator> validators = context.getBeansOfType(Validator.class);

// 6. Публикация события
context.publishEvent(new MyCustomEvent(this, "Данные обновлены"));

Контекст инициализируется один раз при старте приложения (обычно в ServletContextListener для веб-приложений), загружает все определения бинов и затем обслуживает запросы, предоставляя готовые экземпляры.