Лекция 1 Презентация

Содержание

Слайд 2

Слайд 3

Что получим на выходе?

Что получим на выходе?

Слайд 4

Где взять JDK? ХТО ТАКОЙ ЭТОТ ВАШ JDK?

Где взять JDK?

ХТО ТАКОЙ ЭТОТ ВАШ JDK?

Слайд 5

JavaBean

JavaBean

Слайд 6

Bean scope

Bean scope

Слайд 7

Bean lifecycle

Bean lifecycle

Слайд 8

Bean lifecycle

Bean lifecycle

Слайд 9

Component Scan

Component Scan

Слайд 10

Component Scan

Component Scan

Слайд 11

Component vs Service vs Repository

Component vs Service vs Repository

Слайд 12

@Configuration

@Configuration

Слайд 13

Qualifier vs Primary

Qualifier vs Primary

Слайд 14

Qualifier

Qualifier

Слайд 15

Conditional

Conditional

Слайд 16

@Autowired

@Autowired

Слайд 17

Constructor injection

Constructor injection

Слайд 18

Circular Reference

Circular Reference

Слайд 19

International Students and Scholars Rock

International Students and Scholars Rock

Слайд 20

Слайд 21

Пример контроллера @PathVariable

Пример контроллера @PathVariable

Слайд 22

Пример контроллера @RequestBody Плохой пример!!! Не передавайте @Entity в @RequestBody контроллера.

Пример контроллера @RequestBody

Плохой пример!!!
Не передавайте @Entity в @RequestBody контроллера.
Вместо этого следует

использовать DTO,
Который только косвенно связан с данными. (об этом позже)
Слайд 23

Пример контроллера @RequestParam В запросе @RequestParam c типом List будут выглядеть,

Пример контроллера @RequestParam

В запросе @RequestParam c типом List будут выглядеть, как

ids[]=1,2,3,4,5

@RequestParam могут не передаваться в запросе.
В таком случае мы указываем required=false,
а в переменную будет помещено значение null,
если Spring не сможет найти ожидаемый параметр в запросе.

Слайд 24

Пример контроллера на скачивание файла

Пример контроллера на скачивание файла

Слайд 25

Скачивание файлов при помощи контроллера Для того чтобы вернуть файл из

Скачивание файлов при помощи контроллера

Для того чтобы вернуть файл из контроллера

не обязательно работать с HttpServletResponse напрямую.
Можно воспользоваться одним из следующих возвращаемых типов:
ResponseEntity или
ResponseEntity или
ResponseEntity
Слайд 26

Пример контроллера на загрузку файла В дальнейшем из photo можно извлечь информацию при помощи photo.getInputStream()

Пример контроллера на загрузку файла

В дальнейшем из photo можно извлечь информацию

при помощи photo.getInputStream()
Слайд 27

НЕ ДЕЛАЙТЕ ТАК

НЕ ДЕЛАЙТЕ ТАК

Слайд 28

НЕ ДЕЛАЙТЕ ТАК

НЕ ДЕЛАЙТЕ ТАК

Слайд 29

НЕ ДЕЛАЙТЕ ТАК

НЕ ДЕЛАЙТЕ ТАК

Слайд 30

Используйте пагинацию на findAll

Используйте пагинацию на findAll

Слайд 31

Controller Контроллер возвращает путь к шаблону Шаблон рендерится при помощи Thymeleaf

Controller

Контроллер возвращает
путь к шаблону
Шаблон рендерится при помощи Thymeleaf
Данные в шаблон

попадают через Model
Слайд 32

Valid @Valid UserAccount userAccount;

Valid

@Valid UserAccount userAccount;

Слайд 33

Validated @Validated(BasicInfo.class) UserAccount userAccount;

Validated

@Validated(BasicInfo.class) UserAccount userAccount;

Слайд 34

Слайд 35

Filter

Filter

Слайд 36

ExceptionHandler Любой выкинутый за время работы приложения Exception будет перехвачен ExceptionHandler

ExceptionHandler

Любой выкинутый за время работы приложения Exception будет перехвачен ExceptionHandler и

сформирует ответ, который необходимо вернуть пользователю.
Слайд 37

Spring Data JPA

Spring Data JPA

Слайд 38

Конфигурируем Datasource jwt.secret – собственная переменная, которая была введена для валидации

Конфигурируем Datasource

jwt.secret – собственная переменная, которая
была введена для валидации JWT

Важно чтобы

была зависимость spring-data и драйвера postgres
Слайд 39

@Entity

@Entity

Слайд 40

@Entity

@Entity

Слайд 41

@Entity

@Entity

Слайд 42

@Entity

@Entity

Слайд 43

@Entity

@Entity

Слайд 44

N+1 проблема

N+1 проблема

Слайд 45

N+1 как должно быть

N+1 как должно быть

Слайд 46

N+1 проблема

N+1 проблема

Слайд 47

N+1 как должно быть

N+1 как должно быть

Слайд 48

N+1 как решить – BatchSize

N+1 как решить – BatchSize

Слайд 49

N+1 как решить – SUBSELECT

N+1 как решить – SUBSELECT

Слайд 50

N+1 как решить – JOIN

N+1 как решить – JOIN

Слайд 51

FetchType

FetchType

Слайд 52

Слайд 53

Слайд 54

Entity vs DTO

Entity vs DTO

Слайд 55

Validation @NotNull, @NotEmpty, @NotBlank, @Null @Email @Min, @Max, @Length @Size @Future,

Validation

@NotNull, @NotEmpty, @NotBlank, @Null
@Email
@Min, @Max, @Length
@Size
@Future, @Past
@Negative, @NegativeOrZero, @Positive, @PositiveOrZero

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-builtin-constraints

Слайд 56

JpaRepository

JpaRepository

Слайд 57

JpaRepository При помощи рефлексии `JpaRepository` может составлять относительно простые запросы. Стандартные

JpaRepository

При помощи рефлексии `JpaRepository` может составлять относительно простые запросы.
Стандартные методы:
.save()
.findById()
.findAll()
.delete()
.deleteAll()
.exists()

Слайд 58

JpaRepository Более сложные запросы следует составлять при помощи @Query @Query бывает

JpaRepository

Более сложные запросы следует составлять при помощи @Query

@Query бывает native и

по умолчанию. native=true обозначает использовать голый диалект SQL сервера.
Native по умолчанию использует диалект JPA
Слайд 59

JpaRepository @Query можно совместить вместе с @Modifying

JpaRepository

@Query можно совместить вместе с @Modifying

Слайд 60

@Transactional @Transactional заставляет метод выполняться в рамках одной транзакции. Брошенное исключение откатит транзакцию.

@Transactional

@Transactional заставляет метод выполняться в рамках одной транзакции. Брошенное исключение откатит

транзакцию.
Слайд 61

@Transactional https://sysout.ru/transaction-propagation/

@Transactional

https://sysout.ru/transaction-propagation/

Слайд 62

@Transactional

@Transactional

Слайд 63

@Transactional

@Transactional

Слайд 64

@Transactional

@Transactional

Слайд 65

@Transactional

@Transactional

Слайд 66

@Transactional

@Transactional

Слайд 67

@Transactional

@Transactional

Слайд 68

@Transactional

@Transactional

Слайд 69

@Transactional

@Transactional

Слайд 70

@Propagation Propagation отвечает на вопросы: что если два метода аннотированы @Transactional,

@Propagation

Propagation отвечает на вопросы: 
что если два метода аннотированы @Transactional, и один

вызывается из другого?
Будет ли создано две транзакции, или же одна?
Будет ли внутренний метод выбрасывать исключение, если снаружи нет никакой транзакции?
Слайд 71

@Isolation

@Isolation

Слайд 72

@Isolation

@Isolation

Слайд 73

@Isolation

@Isolation

Слайд 74

@Isolation

@Isolation

Слайд 75

Liquibase – sql файл

Liquibase – sql файл

Слайд 76

Liquibase – changelog-v0_1_0.yaml

Liquibase – changelog-v0_1_0.yaml

Слайд 77

Liquibase – changelog-v1_0_0.yaml

Liquibase – changelog-v1_0_0.yaml

Слайд 78

Liquibase – db.changelog-master.yaml

Liquibase – db.changelog-master.yaml

Слайд 79

Liquibase – application.yaml

Liquibase – application.yaml

Слайд 80

Testcontainers

Testcontainers

Слайд 81

Testcontainers – base test

Testcontainers – base test

Слайд 82

Testcontainers – junit-jupiter

Testcontainers – junit-jupiter

Слайд 83

junit-Jupiter – нет миграций

junit-Jupiter – нет миграций

Слайд 84

Postgres in docker

Postgres in docker

Слайд 85

Dockerfile

Dockerfile