Spring предлагает контейнер, часто называемый контекстом приложения Spring, который создает компоненты приложения и управляет ими.
Основные ветки
- Spring Data - определение репозиториев данных приложений в форме простых интерфейсов Java.
- Spring MVC - веб-приложения(Model-View-Control).
- Spring Security - безопасность приложений, включая аутентификацию, авторизацию и защиту API.
- Spring Boot - подключение начальных зависимостей и автоконфигурация, более гибкая отладка, спецификация и тестирование.
- Spring Native - оптимизация работы Spring Boot, повышение скорости работы и уменьшение занимаемого места.
- Spring Integration и Spring Batch - интеграция в другие приложения и другие компоненты в реальном времени и в пакетах соответственно.
- Spring Cloud - развертывание микросервисов и разработка облачных приложений.
- DI / IoC
- Application context
- Жизненный цикл Бина
- Типичные шаги в работе со Spring
- Способы внедрения зависимостей
IoC (Inversion of Control) - Инверсия управления - архитектурный подход, при котором сущность не сама создает свои зависимости, а зависимости подаются извне.
Может реализовываться как механизм передачи процесса выполнения кода/программы фреймворку. При использовании библиотеки вы сами прописываете в своем коде какой метод какого объекта вызвать, а в случае с фреймворками — чаще всего уже фреймворк будет вызывать в нужный ему момент тот код, который вы написали. То есть , тут уже не вы управляете процессом выполнения кода/программы, а фреймворк это делает за вас. Вы передали ему управление (инверсия управления).
Dependency Inversion - инверсия зависимостей - попытки не делать жестких связей между вашими модулями/классами, где один класс напрямую завязан на другой;
Dependency Injection - Внедрение зависимости — процесс предоставления внешней зависимости программному компоненту. Вместо ручного создания объектов в мейне их создает Спринг и передает их в методы по конфигурации.
В технологии внедрения зависимостей компоненты не создают и не поддерживют жизненный цикл других компонентов компонентов, от которых он зависят, а полагаются в этом на отдельный объект (контейнер), который создаст все нужные компоненты и внедрит их в другие пкомпоненты, которые в них нуждаются.
- Создаем Java-классы (Будущие бины);
- Создаем и связываем бины с помощью Spring (Аннотации, XML, или Java-код);
- При использовании, все объекты (бины) берутся из контейнера Spring
Контекст - набор бинов (объектов). Обращаясь к контексту можно получить нужный бин (объект) по его имени, типу или чему-то еще.
applicationContext.xml создается в папке resources
- Запуск Spring приложения
- Запускается Spring контейнер (Application Context)
- Создается объект бина
- В бин внедряются зависимости (Dependency Injection)
- Вызывается указанный init-method, отвечающий за инициализацию ресурсов, обращение к внешним файлам, запуск БД
- Бин готов к использованию
- Вызывается указанный destroy-method, отвечающий за очищение ресурсов, закрытие потоков ввода-вывода, закрытие доступа к бд.
- Остановка Spring приложения
Для бинов со scope "prototype" Spring не вызывает destroy метод
Пример:
<bean id="musicBean"
class="ru.alishev.springcourse.ClassicalMusic"
init-method="doMyInit"
destroy-method="doMyDestroy">
</bean>
// Методы создаются в классе бина
Указать спрингу, какие именно объекты нужны для работы можно тремя способами, которые можно комбинировать между собой:
- Автоматическая конфигурация - наиболее приоритетный способ
- При помощи java-конфигов (создание объектов, используя java-код)
- При помощи xml файлов/конфигов - самый низкоприоритетный способ
Внедряемый бин
<bean id="musicBean"
class="org.example.ClassicalMusic">
</bean>
public MusicPlayer(Music music) { this.music = music;}
<bean id = "musicPlayer" class = "org.example.MusicPlayer">
<constructor-arg ref="musicBean"/> // Ссылка на объект
</bean>
Внедрение ссылки на объект
public void setMusic(Music music) {
this.music = music;
}
<bean id = "musicPlayer" class = "org.example.MusicPlayer">
<property name="music" ref="musicBean"/>
<!-- name - имя сеттера с маленькой буквы-->
</bean>
Внедрение простых значений
private String name;
private String volume;
public void setName(String name) { this.name = name; }
public void setVolume(String volume) { this.volume = volume; }
<property name="name" value="Cant Stxp"/>
<property name="volume" value="50"/>
<!-- name - имя сеттера с маленькой буквы-->
Внедрение значений из файла
Файл с расширением
.properties
в каталоге resources
// musicPlayer.properties:
//musicPlayer.name=SomeName
//musicPlayer.value=70
<context:property-placeholder location="classpath:musicPlayer.properties"/>
<!--classpath: - папка resources -->
<property name="name" value="${musicPlayer.name}"/>
<property name="volume" value="${musicPlayer.value}"/>
<!--musicPlayer - название файла конфигурации -->
Scope наборы паттернов, по которым Spring создает бины.
- По умолчанию используется singleton. Применяется когда у бина нет изменяемых состояний (stateless).
- Prototype, каждый раз создающий новый объект при вызове
getBean()
. Применяется когда у бина есть изменяемые состояния (stateful). - request
- session
- global-session
Пример
class="MusicPlayer" scope="prototype">
- XML, аннотации или Java-код;
- Автоматизация (Autowiring);