ApplicationContext - это главный интерфейс в Spring-приложении, который предоставляет информацию о конфигурации приложения.
Контекст - набор бинов (объектов). Обращаясь к контексту можно получить нужный бин (объект) по его имени, типу или чему-то еще.
У ApplicationContext есть большое количество реализаций, они отличаются друг от друга тем, каким способом задаются мета-данные и где хранится эта конфигурация.
ClassPathXmlApplicationContext— метаданные конфигурируются XML-файлом(-ами) и они лежат в classpath, т. е. в ресурсах модуля;FileSystemXmlApplicationContext— метаданные тоже конфигурируются XML-файлом(-ами), но они находятся где-то в файловой системе, например,/etc/yourapp/spring-context.xml;AnnotationConfigApplicationContext— метаданные конфигурируются с помощью аннотаций
Современным способом конфигурирования считаются аннотации AnnotationConfigApplicationContext.
@Configuration
@ComponentScan
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Main.class);
}
}Указать спрингу, какие именно объекты нужны для работы можно тремя способами, которые можно комбинировать между собой:
- При помощи XML файла конфикурации - самый низкоприоритетный способ, но многие приложения до сих пор его используют
- Java аннотаций и немного XML - современный способ, наиболее приоритетный
- Вся конфигурация на Java коде (создание объектов, используя java-код) - современный способ
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>...</version>
</dependency>
spring-core
spring-beans
spring-contextIoC (Inversion of Control) - Инверсия управления - архитектурный подход, при котором сущность не сама создает свои зависимости, а зависимости подаются извне.
Может реализовываться как механизм передачи процесса выполнения кода/программы фреймворку. При использовании библиотеки вы сами прописываете в своем коде какой метод какого объекта вызвать, а в случае с фреймворками — чаще всего уже фреймворк будет вызывать в нужный ему момент тот код, который вы написали. То есть , тут уже не вы управляете процессом выполнения кода/программы, а фреймворк это делает за вас. Вы передали ему управление (инверсия управления).
(Dependency Inversion) - инверсия зависимостей - попытки не делать жестких связей между вашими модулями/классами, где один класс напрямую завязан на другой;
DI (Dependency Injection) - Внедрение зависимости — процесс предоставления внешней зависимости программному компоненту. Вместо ручного создания объектов, Спринг создает бины и передает их в методы по конфигурации.
В технологии внедрения зависимостей компоненты не создают и не поддерживют жизненный цикл других компонентов компонентов, от которых он зависят, а полагаются в этом на отдельный объект (контейнер), который создаст все нужные компоненты и внедрит их в другие пкомпоненты, которые в них нуждаются.