Ответ
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 для веб-приложений), загружает все определения бинов и затем обслуживает запросы, предоставляя готовые экземпляры.