Как ApplicationContext реализует принцип инверсии управления (IoC) в Spring?

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

Ответ

ApplicationContext — это центральный IoC-контейнер в Spring, который является практической реализацией принципа инверсии управления (Inversion of Control).

Связь IoC и ApplicationContext:

  • Принцип IoC: Передача ответственности за создание объектов и управление их зависимостями от самого приложения (кода разработчика) на внешний фреймворк (контейнер).
  • Реализация через ApplicationContext: Контейнер берет на себя роль этого "внешнего фреймворка". Он:
    1. Создает объекты (бины) на основе конфигурации (аннотации, XML, Java Config).
    2. Управляет их жизненным циклом (вызывает методы инициализации и уничтожения).
    3. Внедряет зависимости (Dependency Injection) между бинами, связывая их автоматически.

Пример перехода от обычного кода к IoC через ApplicationContext:

// Традиционный подход (прямое управление)
class TraditionalService {
    private Repository repository = new JdbcRepository(); // Зависимость создается вручную
}

// Подход с Spring IoC (управление через ApplicationContext)
@Configuration
class AppConfig {
    @Bean
    public Repository repository() {
        return new JdbcRepository(); // Контейнер создает бин
    }
    @Bean
    public Service service(Repository repo) { // Контейнер внедряет зависимость
        return new Service(repo);
    }
}
// ApplicationContext создает и связывает бины
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Service service = ctx.getBean(Service.class); // Готовый к использованию бин со всеми зависимостями

Таким образом, ApplicationContext инвертирует контроль: не код ищет зависимости, а контейнер предоставляет их готовыми.