Ответ
Основной интерфейс: 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, просто причёсанный и в смокинге.