Главная страница

спринг пекции. Spring для начинающих


Скачать 2.11 Mb.
НазваниеSpring для начинающих
Анкорспринг пекции
Дата23.03.2023
Размер2.11 Mb.
Формат файлаpdf
Имя файла102 all-slides.pdf
ТипДокументы
#1009485
страница1 из 3
  1   2   3

zaurtregulov@gmail.com
Spring для начинающих

Для кого предназначен данный курс?
• Для людей, совсем ничего не знающих о Spring и Hibernate
• Для людей, которые хотят расширить знания о
Spring и Hibernate и закрепить свои знания различными примерами

Чем необходимо обладать для
начала просмотра курса?
• Базовыми знаниями языка программирования Java
• ЖЕЛАНИЕМ
изучить Spring, Hibernate и Spring Boot
Простые объяснения
Простые примеры
Много практики
Успешное обучение
+
+
=

Содержание курса
IoC и DI
AOP
Hibernate
Spring MVC
Spring MVC + Hibernate + AOP
Spring REST
Spring Security
Spring Boot

Spring для начинающих
• Уроки стали короткими
• Уроки сохранили эффективность
• Стало ещё больше примеров
Спрашивайте и Помогайте
Не забудьте оценить

Spring
Spring – это фреймворк, предназначенный для более быстрого и простого построения
Java приложений
Год создания: 2004
Последняя версия
(на 27.10.2020)
Spring 5
Официальный сайт: www.spring.io

Inversion of Control
class
Test1
Spring
Container configuration file
Предоставьте объект Pet
Получите объект
Dog
Cat


Inversion of Control
Основные функции, которые выполняет
Spring Container:
• IoC – инверсия управления
Создание и управление объектами
• DI – Dependency Injection
Внедрение зависимостей
IoC – аутсорсинг создания и управления объектами. Т.е. передача программистом прав на создание и управление объектами Spring-у.

Inversion of Control
Способы конфигурации Spring Container:
• XML file (устаревший способ)
• Annotations + XML file (современный способ)
• Java code (современный способ)

Inversion of Control
Конфигурация XML файла:
• id – идентификатор бина
• class – полное имя класса

Inversion of Control
Spring Bean (или просто bean) – это объект, который создаётся и управляется Spring Container
ApplicationContext представляет собой Spring
Container. Поэтому для получения бина из Spring
Container нам нужно создать ApplicationContext.

Dependency Injection
Employee
Car
House
Pet
Window
Door
Wall

Dependency Injection
Spring Container
Employee
Car
House
Pet
Window
Door
Wall

Dependency Injection
DI – аутсорсинг добавления/внедрения зависимостей. DI делает объекты нашего приложения слабо зависимыми друг от друга.
Способы внедрения зависимостей:
• С помощью конструктора
• С помощью сеттеров
• Autowiring

Dependency Injection
DI с помощью конструктора:
За кулисами:
• constructor-arg – аргумент конструктора
• ref – ссылка на bean id

Dependency Injection
DI с помощью сеттера:
За кулисами:
Первая буква в слове «pet» становится заглавной и в начало слова добавляется «set». После чего вызывается получившийся метод.

Dependency Injection
Внедрение строк и других значений:
За кулисами:
• value – значение, которое мы хотим присвоить.

Dependency Injection
Внедрение строк и других значений из properties файла:
За кулисами:

IoC & DI
IoC – аутсорсинг создания и управления объектами. Т.е. передача программистом прав на создание и управление объектами Spring-у.
DI – аутсорсинг добавления/внедрения зависимостей. DI делает объекты нашего приложения слабо зависимыми друг от друга.
Большое количество программистов используют эти термины как взаимозаменяемые.

Bean scope
Scope (область видимости) определяет:
жизненный цикл бина
• возможное количество создаваемых бинов
Разновидности bean scope:
singletone
prototype
request session global-session

Bean scope
singletone – дефолтный scope.
• такой бин создаётся сразу после прочтения Spring
Container-ом конфиг файла.
• является общим для всех, кто запросит его у Spring
Container-а.
• подходит для stateless объектов.
Dog
Spring Container

Bean scope
prototype
• такой бин создаётся только после обращения к
Spring Container-у с помощью метода getBean.
• для каждого такого обращения создаётся новый бин в Spring Container-е.
• подходит для stateful объектов.
Dog
Spring Container
Dog

Жизненный цикл бина
init-method
Запуск приложения
Начало работы
Spring Container
Создание бина
DI – внедряются зависимости
destroy-method
Бин готов для использования
Использование нами этого бина
Конец работы
Spring Container
Остановка приложения
Чаще всего init-method используется для открытия или настройки каких-либо ресурсов, например баз данных, стримов и т.д.
destroy-method чаще всего используется для их закрытия.

Методы init и destroy

Методы init и destroy
У данных методов access modifier может быть любым
У данных методов return type может быть любым. Но из-за того, что возвращаемое значение мы никак не можем использовать, чаще всего return type – это void.
Называться данные методы могут как угодно.
В данных методах не должно быть параметров.

Методы init и destroy
Если у бина scope = prototype, то:
• для этого бина destroy-method вызываться не будет
• init-method будет вызываться для каждого новосозданного бина.
• программисту необходимо самостоятельно писать код для закрытия/освобождения ресурсов, которые были использованы в бине

Конфигурация с помощью аннотаций
Аннотации – это специальные комментарии/метки/метаданные, которые нужны для передачи определённой информации.
Конфигурация с помощью аннотаций более короткий и быстрый способ, чем конфигурация с помощью XML файла.
Процесс состоит из 2-х этапов:
1. сканирование классов и поиск аннотации
@Component
2. Создание (регистрация) бина в Spring Container-е

Конфигурация с помощью аннотаций

Конфигурация с помощью аннотаций
Если к аннотации @Component не прописать bean id, то бину будет назначен дефолтный id.
Дефолтный bean id получается из имени класса, заменяя его первую заглавную букву на прописную.
cat favoriteSong
SQLTest

@Autowired
Для внедрения зависимостей с помощью аннотаций используется аннотация @Autowired
Типы autowiring-а или где мы можем использовать данный DI:
• Конструктор
• Сеттер
• Поле

@Autowired
Процесс внедрения зависимостей при использовании @Autowired такой:
1. Сканирование пакета, поиск классов с аннотацией @Component
2. При наличии аннотации @Autowired начинается поиск подходящего по типу бина
Далее ситуация развивается по одному из сценариев:
 Если находится 1 подходящий бин, происходит внедрение зависимости;
 Если подходящих по типу бинов нет, то выбрасывается исключение;
 Если подходящих по типу бинов больше одного, тоже выбрасывается исключение.

@Autowired
Constructor injection
Setter injection
Any method injection
Field injection

@Qualifier
Если при использовании @Autowired подходящих по типу бинов больше одного, то выбрасывается исключение. Предотвратить выброс данного исключения можно конкретно указав, какой бин должен быть внедрён. Для этого и используют аннотацию @Qualifier.

@Qualifier
Field
Setter
Constructor

@Value
Для внедрения строк и других значений можно использовать аннотацию @Value.
В этом случае в сеттерах нет необходимости, как это было при конфигурации с помощью XML файла.
Hardcoded вариант
Вариант с properties файлом

Bean scope
singletone – дефолтный scope.

такой бин создаётся сразу после прочтения Spring Container-ом конфиг файла.

является общим для всех, кто запросит его у Spring Container-а.

подходит для stateless объектов.
prototype

такой бин создаётся только после обращения к Spring Container- у с помощью метода getBean.

для каждого такого обращения создаётся новый бин в Spring
Container-е.

подходит для stateful объектов.

Методы init и destroy
У данных методов access modifier может быть любым
У данных методов return type может быть любым. Но из-за того, что возвращаемое значение мы никак не можем использовать, чаще всего return type – это void.
Называться данные методы могут как угодно.
В данных методах не должно быть параметров.

Методы init и destroy
Если у бина scope = prototype, то:
• для этого бина destroy-method вызываться не будет
• init-method будет вызываться для каждого новосозданного бина.
• программисту необходимо самостоятельно писать код для закрытия/освобождения ресурсов, которые были использованы в бине

@PostConstruct и @PreDestroy

Конфигурация Spring Container-а с помощью
Java кода. Способ 1
При использовании конфигурации с помощью Java кода, Spring
Container будет представлен классом
AnnotationConfigApplicationContext
Аннотация @Configuration означает, что данный класс является конфигурацией.
С помощью аннотации @ComponentScan мы показываем, какой пакет нужно сканировать на наличие бинов и разных аннотаций.

Конфигурация Spring Container-а с помощью
Java кода. Способ 2
• Данный способ не использует сканирование пакета и поиск бинов. Здесь бины описываются в конфиг классе.
• Данный способ не использует аннотацию @Autowired. Здесь зависимости прописываются вручную.
• Название метода – это bean id.
• Аннотация @Bean перехватывает все обращения к бину и регулирует его создание.

Аннотация @PropertySource
Аннотация @PropertySource указывает на property файл откуда мы можем использовать значения для полей

Aspect Oriented Programming
Method addBook(String bookName, int personId)
Основная логика метода
Логирование
Проверка прав доступа

Aspect Oriented Programming
Основная логика метода
Логирование
Проверка прав доступа addBook
Основная логика метода
Логирование
Проверка прав доступа removeBook
Основная логика метода
Логирование
Проверка прав доступа getBook
Li br ar y
Основная логика метода
Логирование
Проверка прав доступа method1
Основная логика метода
Логирование
Проверка прав доступа method3
Основная логика метода
Логирование
Проверка прав доступа method2
clas s
XY
Z
……………

……………
……………

Aspect Oriented Programming
Проблемы, с которыми мы сталкиваемся:
• Переплетение бизнес-логики со служебным функционалом (Code tangling). Метод становится громоздким, и его основной функционал сразу не заметно.
• Разбросанность служебного функционала по всему проекту (Code scattering). При необходимости что-то изменить в служебном функционале, мы должны будем делать изменения во всех классах.

Aspect Oriented Programming
AOP – парадигма программирования, основанная на идее разделения основного и служебного функционала. Служебный функционал записывается в Aspect-классы.
В основе Aspect заключена сквозная логика
(cross-cutting logic).

Aspect Oriented Programming
К сквозному функционалу относят:
• Логирование
• Проверка прав (security check)
• Обработка транзакций
• Обработка исключений
• Кэширование
• И т.д.

Aspect Oriented Programming
Метод для логирования
Метод, проверяющий права доступа
Aspect
Вызов метода
addBook

Aspect Oriented Programming
Вызов метода
addBook
Main класс метод
addBook
Library класс

Aspect Oriented Programming
Метод для логиро- вания
Метод, проверя- ющий права доступа
Вызов метода
addBook
Main класс метод
addBook
Library класс
AOP
Proxy

Aspect Oriented Programming
Плюсы AOP:
• Сквозной функционал сосредоточен в 1-м или нескольких обособленных классах. Это позволяет легче его изменять.
• Становится легче добавлять новые сквозные работы для нашего основного кода или имеющиеся сквозные работы для новых классов. Это достигается благодаря конфигурации аспектов.
• Бизнес-код приложения избавляется от сквозного кода, становится меньше и чище. Работать с ним становится легче

Aspect Oriented Programming
Минус AOP:
• Дополнительное время на работу аспектов

Aspect Oriented Programming
AOP frameworks
Spring AOP
AspectJ
Предоставляет самую распространённую и необходимую функциональность AOP
Более сложный в использовании
Простой в использовании
Предоставляет всю функциональность AOP

Aspect Oriented Programming
Метод для логирования
Вызов метода
getBook
Test1 класс метод
getBook
Library класс
AOP
Proxy

Aspect
@EnableAspectJAutoProxy позволяет нам за кулисами использовать
Spring AOP Proxy
@Aspect говорит о том, что это не простой класс, а Aspect. Поэтому к данному классу Spring будет относиться по другому.
Aspect – это класс, отвечающий за сквозную функциональность.

Advice Типы
• Before – выполняется до метода с основной логикой
• After returning – выполняется только после нормального окончания метода с основной логикой
• After throwing – выполняется после окончания метода с основной логикой только, если было выброшено исключение
• After/ After finally – выполняется после окончания метода с основной логикой
• Around – выполняется до и после метода с основной логикой

Advice и Pointcut
Advice – метод, который находится в Aspect-е и содержит сквозную логику. Advice определяет, что и когда должно происходить.
В идеале Advice должен быть небольшим и быстро работающим.
Pointcut – выражение, описывающее где должен быть применён
Advice.

Pointcut
Pointcut – выражение, описывающее где должен быть применён
Advice.
Spring AOP использует AspectJ Pointcut expression language. Т.е. определённые правила в написании выражений для создания
Pointcut
execution( modifiers-pattern? return-type-pattern declaring-type-pattern?
method-name-pattern(parameters-pattern) throws-pattern? )

Pointcut
Соответствует методу без параметров, где бы он ни находился с access modifier = public, return type = void и именем = getBook
Соответствует методу без параметров, из класса UnivercityLibrary с access modifier = public, return type = void и именем = getBook
Соответствует методу без параметров, где бы он ни находился с access modifier = public, return type = void и именем, начинающимся на «get»
Соответствует методу без параметров, где бы он ни находился с любым access modifier, любым return type и именем = getBook
Соответствует методу без параметров, где бы он ни находился с любым access modifier, любым return type и любым именем

Pointcut
Соответствует методу с параметром
String, где бы он ни находился с access modifier = public, return type = void и именем = getBook
Соответствует методу с любым одним параметром, где бы он ни находился с access modifier = public, return type = void и именем = getBook
Соответствует методу с любым количеством любого типа параметров, где бы он ни находился с access modifier
= public, return type = void и именем = getBook

Pointcut
Соответствует методу с любым количеством любого типа параметров, где бы он ни находился с любым access modifier, любым return type и любым именем
Соответствует методу, первым параметром которого является aop.Book, а дальше может идти 0 и больше параметров любого типа, где бы этот метод ни находился с access modifier = public, return type = void и именем
= getBook

Объявление Pointcut
Для того, чтобы не пользоваться copy-paste когда для нескольких
Advice-ов подходит один и тот же Pointcut, есть возможность объявить данный Pointcut и затем использовать его несколько раз.
@Pointcut(“pointcut_expression”)
private void pointcut_reference() {}
@Before(“pointcut_reference() ”)
public void advice_name() { some code }

Объявление Pointcut
Плюсы объявления Pointcut:
• Возможность использования созданного Pointcut для множества Advice-ов
• Возможность быстрого изменения Pointcut expression для множества Advice-ов
• Возможность комбинирования Pointcut-ов

Комбинирование Pointcut-ов
Комбинирование Pointcut-ов – это их объединение с помощью логических операторов
&& || !

Порядок выполнения Aspect-ов
Если при вызове 1-го метода с бизнес-логикой срабатывают несколько Advice-ов, то нет никакой гарантии в порядке выполнения этих Advice-ов.
Для соблюдения порядка такие Advice-ы нужно распределять по отдельным упорядоченным Aspect-ам.
@Order(3) упорядочивает
Aspect-ы.
Чем меньше число, тем выше приоритет.

Join Point
Joint Point – это точка/момент в выполняемой программе когда следует применять Advice. Т.е. это точка переплетения метода с бизнес-логикой и метода со служебным функционалом.
Прописав Joint Point в параметре метода Advice, мы получаем доступ к информации о сигнатуре и параметрах метода с бизнес- логикой.

  1   2   3


написать администратору сайта