Spring Context

ApplicationContext — контейнер и среда исполнения Spring-приложения. Он расширяет базовый BeanFactory: добавляет события, ресурсы, сообщения, профили и интеграцию с инфраструктурой.

Распространённые реализации

  • AnnotationConfigApplicationContext — обычное приложение с Java-конфигурацией;
  • AnnotationConfigServletWebServerApplicationContext — servlet-приложение Spring Boot;
  • reactive web context — для WebFlux;
  • тестовый контекст создаётся Spring Test и кэшируется между совместимыми тестами.

XML-контексты существуют, но в новых проектах чаще встречаются аннотации и Java-конфигурация.

Иерархия

Контекст может иметь родителя. Дочерний видит родительские бины, родитель не видит дочерние. Это встречается в web-инфраструктуре и сложных модульных приложениях, но большинство Boot-приложений использует один основной контекст.

Доступ к бинам

Обычный код получает зависимости через конструктор. Вызов context.getBean() уместен в инфраструктуре или динамическом выборе, но повсеместное использование превращает контейнер в service locator.

Вопросы для повторения

  1. Чем ApplicationContext шире BeanFactory? Добавляет инфраструктуру приложения поверх создания бинов.
  2. Нужно ли хранить context в каждом сервисе? Нет, зависимости лучше внедрять явно.
  3. Может ли быть несколько контекстов? Да, включая иерархию, но это усложняет видимость бинов.
  4. Потокобезопасны ли все бины контекста? Нет, singleton означает один экземпляр, а не автоматическую thread safety.

Связано: IoC контейнер, Виды бинов, Spring.