Что такое Application Context в Spring и зачем он нужен?

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

Ответ

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

Основные функции:

  1. Управление бинами: Создание экземпляров, внедрение зависимостей (DI), вызов методов инициализации (@PostConstruct) и уничтожения (@PreDestroy).
  2. Конфигурация: Объединение конфигурации из различных источников (аннотации, Java-классы, XML, свойства).
  3. Доступ к ресурсам: Упрощённая работа с файлами, сообщениями для интернационализации (i18n) и событиями приложения.
  4. Интеграция с AOP: Обеспечивает работу аспектно-ориентированного программирования (например, транзакции, кэширование).

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

@Configuration
public class AppConfig {
    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }

    @Bean
    public MyService myService(MyRepository repo) {
        return new MyServiceImpl(repo); // DI через параметр метода
    }
}

public class MainApp {
    public static void main(String[] args) {
        // Создание контекста на основе Java-конфигурации
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

        // Получение бина из контекста
        MyService service = ctx.getBean(MyService.class);
        service.process();

        // Получение всех бинов определённого типа
        Map<String, MyService> beans = ctx.getBeansOfType(MyService.class);
    }
}

Типы контекстов: AnnotationConfigApplicationContext, ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, WebApplicationContext (для веб-приложений).

Почему это важно: ApplicationContext — это "мозг" Spring-приложения, который связывает все компоненты вместе, управляя зависимостями и освобождая разработчика от ручного создания графа объектов.