Какой основной класс или интерфейс представляет контейнер IoC в Spring?

Ответ

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

Ключевые обязанности:

  • Создание и связывание бинов на основе конфигурации (XML, аннотации, Java-код).
  • Управление жизненным циклом (вызов методов инициализации и уничтожения).
  • Предоставление доступа к бинам и переменным окружения.

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

  • ClassPathXmlApplicationContext — для XML-конфигурации в classpath.
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  • AnnotationConfigApplicationContext — для конфигурации через Java-классы и аннотации.
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
  • WebApplicationContext — специализация для веб-приложений.

Важные методы:

  • T getBean(Class<T> requiredType) — получить бин по типу.
  • Object getBean(String name) — получить бин по имени.
  • boolean containsBean(String name) — проверить существование бина.
  • Environment getEnvironment() — получить доступ к профилям и свойствам.

В Spring Boot контейнер создается автоматически через аннотацию @SpringBootApplication, которая включает сканирование компонентов и автоконфигурацию.

Ответ 18+ 🔞

Ну вот, смотри, чтобы ты не думал, что Spring — это какая-то магия, блядь. Всё это крутится вокруг одной главной суки — ApplicationContext. Это и есть тот самый центральный контейнер, который всё контролирует, как злобный Герасим из рассказа, только вместо Муму у него бины.

Что это за зверь? Это интерфейс org.springframework.context.ApplicationContext. По сути, это инверсия управления в чистом виде, ёпта. Он, этот контейнер, берёт и сам решает: какие объекты (бины) создать, как их между собой склеить хуй с винтом, и когда в итоге отправить на свалку истории. Ты ему конфигурацию подсунул, а он уже сам разбирается, охуенно же?

Чем он, блядь, занят?

  • Рожает и женит бины. На основе твоих XML-файлов, аннотаций или Java-кода он создаёт эти объекты и внедряет зависимости. Автовайринг там всякий, в общем.
  • Дирижирует жизненным циклом. Вызывает методы вроде @PostConstruct для инициализации и @PreDestroy, когда пора нахуй. Полный контроль, блядь.
  • Раздаёт всё направо и налево. Через него ты получаешь доступ к любым бинам и даже к переменным окружения. Он — единая точка входа, типа главного распределительного щита.

А какие у него бывают личины, эта реализации?

  • ClassPathXmlApplicationContext — старый добрый дед, который конфиги из XML-файлов в classpath читает.
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  • AnnotationConfigApplicationContext — более современный чувак, работает с Java-классами, помеченными аннотациями. Гибче, блядь.
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
  • WebApplicationContext — его специализированный братан для веб-приложений, там свои приколы.

Ну и на что смотреть? Главные методы:

  • <T> T getBean(Class<T> requiredType) — дай-ка мне бин такого-то типа. Самый частый запрос.
  • Object getBean(String name) — а вот по имени, если ты извращенец.
  • boolean containsBean(String name) — а есть ли у нас такой бин вообще, или я уже охуел?
  • Environment getEnvironment() — вот тут можно пощупать активные профили и проперти. Очень полезная штука, ядрёна вошь.

А в Spring Boot что? А там, блядь, вообще красота. Ты ставишь одну аннотацию @SpringBootApplication, и контейнер создаётся сам, как по волшебству. Он сам компоненты отсканирует, сам всё сконфигурирует — сиди и радуйся. Но под капотом-то всё тот же самый ApplicationContext, просто причёсанный и в смокинге.