Spring-starter


Нажмите ★, если вам нравится проект. Ваш вклад сердечно ♡ приветствуется.

Если вам интересно мое резюме: https://github.com/DEBAGanov


# Содержание

# [1. Intro ](#1.-Intro)


## [lesson 1. Введение ](#lesson-1.-Введение)

1. [Модули Spring (out of the box) ](#Модули-Spring-(out-of-the-box))
2. [Удобство и простота использования ](#Удобство-и-простота-использования)
3. [Микросервисная архитектура ](#Микросервисная-архитектура)
4. [Support & Community ](#Support-&-Community)
5. [Что нужно знать для изучения курса Spring ](#Что-нужно-знать-для-изучения-курса-Spring)


## [lesson 2. Установка программного обеспечения ](#lesson-2.-Установка-программного-обеспечения)


6. [Установка Java 17 ](#Установка-Java-17)
7. [Установка IntelliJ IDEA Ultimate Edition ](#Установка-IntelliJ-IDEA-Ultimate-Edition)
8. [Установка PostgreSQL ](#Установка-PostgreSQL)
9. [Установка Docker ](#Установка-Docker)
10. [Создание нового проекта ](#Создание-нового-проекта)


## [lesson 3. Inversion of Control. Dependency Injection ](#lesson-3.-Inversion-of-Control.-Dependency-Injection)

11. [Object Dependencies ](#Object-Dependencies)
12. [Object Dependencies в коде ](#Object-Dependencies-в-коде)
13. [Inversion of Control & Dependency Injection ](#Inversion-of-Control-&-Dependency-Injection)
14. [Inversion of Control & Dependency Injection в коде ](#Inversion-of-Control-&-Dependency-Injection-в-коде)
15. [3 способа внедрения зависимостей в объекте ](#3-способа-внедрения-зависимостей-в-объекте)

## [lesson 4. IoC Container ](#lesson-4.-IoC-Container)

16. [Spring IoC Container ](#Spring-IoC-Container)
17. [Bean ](#Bean)
18. [Bean Definition ](#Bean-Definition)
19. [POJO ](POJO)
20. [Основные интерфейсы IoC Container ](#Основные-интерфейсы-IoC-Container)
21. [3 способа создания Bean Definitions ](#3-способа-создания-Bean-Definitions)

# [2. XML-based Configuration](#2.-XML-based-Configuration)

## [lesson 5. XML-based Configuration](#lesson-5.-XML-based-Configuration)

22. [BeanFactory и ApplicationContext интерфейсы ](#BeanFactory-и-ApplicationContext-интерфейсы)
23. [ClassPathXmlApplicationContext ](#ClassPathXmlApplicationContext)
24. [XML config ](#XML-config)
25. [Идентификаторы (id) бинов как ключи в IoC Container ](#Идентификаторы-(id)-бинов-как-ключи-в-IoC-Container)
26. [Алиасы бинов (alias) ](#Алиасы-бинов-(alias))

## [lesson 6. Constructor Injection](#lesson-6.-Constructor-Injection)

27. [Внедрение примитивных типов данных ](#Внедрение-примитивных-типов-данных)
28. [Внедрение коллекций list/set ](#Внедрение-коллекций-list/set)
29. [Внедрение ассоциативного массива map ](#Внедрение-ассоциативного-массива-map)
30. [Поле genericArgumentValues в BeanDefinition ](#Поле-genericArgumentValues-в-BeanDefinition)
31. [Поле indexedArgumentValues в BeanDefinition ](#Поле-indexedArgumentValues-в-BeanDefinition)
32. [Указание атрибута type в параметрах конструктора ](#Указание-атрибута-type-в-параметрах-конструктора)
33. [Указание атрибута name в параметрах конструктора ](#Указание-атрибута-name-в-параметрах-конструктора)

## [lesson 7. Factory Method Injection ](#lesson-7.-Factory-Method-Injection)

34. [Внедрение других бинов через ref* ](#Внедрение-других-бинов-через-ref*)
35. [Создание новое бина CompanyRepository ](#Создание-новое-бина-CompanyRepository)
36. [Внедрение зависимостей через factory method ](#Внедрение-зависимостей-через-factory-method)
37. [Атрибут factory-bean (паттерн ServiceLocator) ](#Атрибут-factory-bean-(паттерн-ServiceLocator))

## [lesson 8. Property Injection ](#lesson-8.-Property-Injection)

38. [Использование set* методов в ConnectionPool ](#Использование-set*-методов-в-ConnectionPool)
39. [Поле propertyValues в BeanDefinition ](#Поле-propertyValues-в-BeanDefinition)
40. [Упрощенный жизненный цикл бинов - Bean Lifecycle ](#Упрощенный-жизненный-цикл-бинов---Bean-Lifecycle)
41. [Плюсы и минусы Constructor и Property Injections ](#Плюсы-и-минусы-Constructor-и-Property-Injections)
42. [Циклические зависимости через Property Injection ](#Циклические-зависимости-через-Property-Injection)

## [lesson 9. Bean Scopes ](#lesson-9.-Bean-Scopes)

43. [Common Bean Scopes ](#Common-Bean-Scopes)
44. [Custom Bean Scopes ](#Custom-Bean-Scopes)
45. [Web Bean Scopes ](#Web-Bean-Scopes)
46. [Prototype Bean Scope ](#Prototype-Bean-Scope)

## [lesson 10. Lifecycle Callbacks ](#lesson-9.-Bean-Scopes)

47. [Измененный Bean Lifecycle ](#Измененный-Bean-Lifecycle)
48. [Initialization callbacks ](#Initialization-callbacks)
49. [Destruction callbacks ](#Destruction-callbacks)

## [lesson 11. Injection from Properties Files ](#lesson-11.-Injection-from-Properties-Files)

50. [Зачем использовать properties files ](#Зачем-использовать-properties-files)
51. [Создание файла application.properties ](#Создание-файла-application.properties)
52. [PropertySourcesPlaceholderConfigurer bean ](#PropertySourcesPlaceholderConfigurer-bean)
53. [Expression Language (EL) ](#Expression-Language-(EL))
54. [Spring Expression Language (SpEL) ](#Spring-Expression-Language-(SpEL))
55. [SpEL документация ](#SpEL-документация)
56. [System properties ](#System-properties)

## [lesson 12. BeanFactoryPostProcessor (BFPP) ](#lesson-12.-BeanFactoryPostProcessor-(BFPP))

57. [Интерфейс BeanFactoryPostProcessor ](#Интерфейс-BeanFactoryPostProcessor)
58. [Как работает PropertySourcesPlaceholderConfigurer ](#Как-работает-PropertySourcesPlaceholderConfigurer)
59. [Измененный Bean Lifecycle ](#Измененный-Bean-Lifecycle)
60. [Метод isAssignableFrom ](#Метод-isAssignableFrom)

## [lesson 13. Custom BeanFactoryPostProcessor ](#lesson-13.-Custom-BeanFactoryPostProcessor)

61. [Создание собственных BeanFactoryPostProcessor ](#Создание-собственных-BeanFactoryPostProcessor)
62. [Интерфейс Ordered ](#Интерфейс-Ordered)
63. [Интерфейс PriorityOrdered ](#Интерфейс-PriorityOrdered)


# 3. [Annotation-based Configuration ](#Annotation-based-Configuration)

## [lesson 14. Annotation-based Configuration ](#lesson-14.-Annotation-based-Configuration)

64. [Подключение зависимости jakarta annotation api ](#Подключение-зависимости-jakarta-annotation-api)
65. [Аннотации @PostConstruct и @PreDestroy ](#Аннотации-@PostConstruct-и-@PreDestroy)
66. [Класс CommonAnnotationBeanPostProcessor ](#Класс-CommonAnnotationBeanPostProcessor)
67. [context:annotation-config xml element ](#context:-annotation-config-xml-element)




## [lesson 15. BeanPostProcessor (BPP) ](#lesson-15.-BeanPostProcessor-(BPP))

68. [Интерфейс BeanPostProcessor ](#Интерфейс-BeanPostProcessor)
69. [Bean Lifecycle (final version) ](#Bean-Lifecycle-(final-version))
70. [Интерфейс Aware ](#Интерфейс-Aware)
71. [Класс ApplicationContextAwareProcessor ](#Класс-ApplicationContextAwareProcessor)


## [lesson 16. Custom BeanPostProcessor. Часть 1 ](#lesson-16.-Custom-BeanPostProcessor.-Часть-1)

72. [Создание своей аннотации @InjectBean ](#Создание-своей-аннотации-@InjectBean)
73. [Создание InjectBeanPostProcessor ](#Создание-InjectBeanPostProcessor)
74. [Утилитный класс ReflectionUtils ](#Утилитный-класс-ReflectionUtils)
75. [Тестирование InjectBeanPostProcessor ](#Тестирование-InjectBeanPostProcessor)

## [lesson 17. Custom BeanPostProcessor. Часть 2 ](#lesson-17.-Custom-BeanPostProcessor.-Часть-2)
76. [Создание аннотации @Transaction ](#Создание-аннотации-@Transaction)
77. [Создание CrudRepository ](#Создание-CrudRepository)
78. [Создание TransactionBeanPostProcessor ](#Создание-TransactionBeanPostProcessor)
79. [Тестирование TransactionBeanPostProcessor ](#Тестирование-TransactionBeanPostProcessor)
80. [Корректируем TransactionBeanPostProcessor ](#Корректируем-TransactionBeanPostProcessor)
81. [Создание AuditingBeanPostProcessor ](#Создание-AuditingBeanPostProcessor)


## [lesson 18. @Autowired & @Value ](#lesson-18.-@Autowired-&-@Value)

82. [Аннотация @Autowired ](#Аннотация-@Autowired)
83. [Аннотация @Resource ](#Аннотация-@Resource)
84. [Решение конлифкта бинов. @Qualifier ](#Решение-конлифкта-бинов.-@Qualifier)
85. [Collection injection ](#Collection-injection)
86. [Properties injection. @Value ](#Properties-injection.-@Value)


## [lesson 19. Classpath Scanning ](#lesson-19.-Classpath-Scanning)
87. [context:component-scan. Аннотации @Component ](#context:-component-scan.-Аннотации-@Component)
88. [Замена бинов из xml на @Component ](#Замена-бинов-из-xml-на-@Component)
89. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 20. Bean Definition Readers ](#lesson-20.-Bean-Definition-Readers)

90. [Component Scan classes ](#Component-Scan-classes)
91. [Bean Definition Readers ](#Bean-Definition-Readers)
92. [Класс ComponentScanBeanDefinitionParser ](#Класс-ComponentScanBeanDefinitionParser)
93. [Класс AnnotatedBeanDefinitionReader ](#Класс-AnnotatedBeanDefinitionReader)

## [lesson 21. Type Filters ](#lesson-21.-Type-Filters)

94. [Атрибут annotation-config ](#Атрибут-annotation-config)
95. [Атрибут name-generator ](#Атрибут-name-generator)
96. [Атрибут resource-pattern ](#Атрибут-resource-pattern)
97. [Атрибут scoped-proxy ](#Атрибут-scoped-proxy)
98. [Атрибут scope-resolver ](#Атрибут-scope-resolver)
99. [Атрибут use-default-filters ](#Атрибут-use-default-filters)
100. [ 5 type filters ](#-5-type-filters)
101. [ Custom filters ](#-Custom-filters)


## [lesson 22. @Scope ](#lesson-22.-@Scope)
102. [Атрибут scope-resolver ](#Атрибут-scope-resolver)
103. [Класс AnnotationScopeMetadataResolver ](#Класс-AnnotationScopeMetadataResolver)
104. [Аннотация @Scope ](#Аннотация-@Scope)


## [lesson 23. JSR 250, JSR 330 ](#lesson-23.-JSR-250,-JSR-330)

105. [Аббревиатура JSR ](#Аббревиатура-JSR)
106. [JSR 250 ](#JSR-250)
107. [JSR 330 ](#JSR-330)
108. [Класс Jsr330ScopeMetadataResolver ](#Класс-Jsr330ScopeMetadataResolver)



# 4. [Java-based Configuration ](#Java-based-Configuration)

## [lesson 24. Java-based Configuration ](#lesson-24.-Java-based-Configuration)
109. [Класс ConfigurationClassBeanDefinitionReader ](#Класс-ConfigurationClassBeanDefinitionReader)
110. [Создание ApplicationConfiguration. @Configuration ](#Создание-ApplicationConfiguration.-@Configuration)
111. [Аннотация @PropertySource ](#Аннотация-@PropertySource)
112. [Аннотация @ComponentScan ](#Аннотация-@ComponentScan)
113. [Класс AnnotationConfigApplicationContext ](#Класс-AnnotationConfigApplicationContext)


## [lesson 25. @Import & @ImportResource ](#lesson-25.-@Import-&-@ImportResource)
114. [Класс AnnotationConfigApplicationContext ](#Класс-AnnotationConfigApplicationContext)
115. [Аннотация @ImportResource ](#Аннотация-@ImportResource)
116. [Аннотация @Import ](#Аннотация-@Import)

## [lesson 26. @Bean. Часть 1 ](#lesson-26.-@Bean.-Часть-1)

117. [Аннотация @Bean ](#Аннотация-@Bean)
118. [Тестирование Java конфигурации ](#Тестирование-Java-конфигурации)
119. [Свойства аннотации @Bean ](#Свойства-аннотации-@Bean)
120. [Аннотация @Scope с @Bean ](#Аннотация-@Scope-с-@Bean)
121. [Внедрение зависимостей с @Bean ](#Внедрение-зависимостей-с-@Bean)
122. [Конфликт имен @Bean и @Component ](#Конфликт-имен-@Bean-и-@Component)

## [lesson 27. @Bean. Часть 2 ](#lesson-27.-@Bean.-Часть-2)

123. [3-ий вариант внедрения зависимостей в @Bean ](#3-ий-вариант-внедрения-зависимостей-в-@Bean)
124. [Cglib proxy в @Configuration ](#Cglib-proxy-в-@Configuration)
125. [Свойство proxyBeanMethods в @Configuration ](#Свойство-proxyBeanMethods-в-@Configuration)
126. [@Bean создаются через паттерн Service Locator ](#@Bean-создаются-через-паттерн-Service-Locator)

## [lesson 28. Profiles ](#lesson-28.-Profiles)
127. [Environment Bean ](#Environment-Bean)
128. [Аннотация @Profile ](#Аннотация-@Profile)
129. [Активация profiles через properties ](#Активация-profiles-через-properties)
130. [Активация profiles через ApplicationContext ](#Активация-profiles-через-ApplicationContext)



# 5. [Event Listeners ](#-Event-Listeners)


## [lesson 29. Event Listeners. Часть 1 ](#lesson-29.-Event-Listeners.-Часть-1)
131. [Шаблон проектирования Listener ](#Шаблон-проектирования-Listener)
132. [Создание события (Event) ](#Создание-события-(Event))
133. [Создание слушателя событий (Listener). @EventListener ](#Создание-слушателя-событий-(Listener).-@EventListener)
134. [Реализация логики для отправки события ](#Реализация-логики-для-отправки-события)

## [lesson 30. Event Listeners. Часть 2 ](#lesson-30.-Event-Listeners.-Часть-2)

135. [Bean ApplicationEventPublisher ](#Bean-ApplicationEventPublisher)
136. [Тестирование слушателей событий ](#Тестирование-слушателей-событий)
137. [Listeners order ](#Listeners-order)
138. [Listeners conditions ](#Listeners-conditions)


# 6. [Spring Boot ](#Spring-Boot)


## [lesson 31. Spring Boot. Введение ](#lesson-31.-Spring-Boot.-Введение)

139. [Spring modules ](#Spring-modules)
140. [Spring Data Configuration ](#Spring-Data-Configuration)
141. [Modules Auto Configuration ](#Modules-Auto-Configuration)
142. [Conditions ](#Conditions)
143. [Spring Boot Starters ](#Spring-Boot-Starters)
144. [Dependency Management ](#Dependency-Management)
145. [How to build Spring Boot Application ](#How-to-build-Spring-Boot-Application)

## [lesson 32. @Conditional ](#lesson-32.-@Conditional)

146. [Аннотация @Conditional ](#Аннотация-@Conditional)
147. [Класс Condition ](#Класс-Condition)
148. [Custom JpaCondition ](#Custom-JpaCondition)
149. [Тестирование JpaCondition ](#Тестирование-JpaCondition)
150. [Аннотация @Profile ](#Аннотация-@Profile)
151. [Другие @Condition аннотации ](#Другие-@Condition-аннотации)


## [lesson 33. Spring Boot. Настройка проекта ](lesson-33.-Spring-Boot.-Настройка-проекта)

152. [Spring Boot Gradle Plugin ](#Spring-Boot-Gradle-Plugin)
153. [Spring Dependency Management Plugin ](#Spring-Dependency-Management-Plugin)
154. [spring-boot-starter ](#spring-boot-starter)
155. [Run Spring Boot Application ](#Run-Spring-Boot-Application)
156. [Autogenerated Spring Boot Project ](#Autogenerated-Spring-Boot-Project)
157. [Maven spring-boot-starter-parent pom ](#Maven-spring-boot-starter-parent-pom)

## [lesson 34. @SpringBootApplication ](#lesson-34.-@SpringBootApplication)

158. [Структура Spring Boot приложения ](#Структура-Spring-Boot-приложения)
159. [Что делает метод SpringApplication.run ](#Что-делает-метод-SpringApplication.run)
160. [Аннотация @SpringBootApplication ](#Аннотация-@SpringBootApplication)
161. [Аннотация @SpringBootConfiguration ](#Аннотация-@SpringBootConfiguration)
162. [Аннотация @ComponentScan ](#Аннотация-@ComponentScan)
163. [Аннотация @PropertySource ](#Аннотация-@PropertySource)
164. [Аннотация @EnableAutoConfiguration ](#Аннотация-@EnableAutoConfiguration)


## [lesson 35. Lombok ](#lesson-35.-Lombok)

165. [Подключение Lombok ](#Подключение-Lombok)
166. [Gradle Lombok Plugin ](#Gradle-Lombok-Plugin)
167. [IntelliJ IDEA Lombok Plugin ](#IntelliJ-IDEA-Lombok-Plugin)
168. [Аннотации Lombok ](#Аннотации-Lombok)
169. [Файл lombok.config ](#Файл-lombok.config)

## [lesson 36. Properties ](#lesson-36.-Properties)

170. [Файл spring.properties ](#Файл-spring.properties)
171. [Externalized Configuration ](#Externalized-Configuration)
172. [Profile-specific properties ](#Profile-specific-properties)
173. [Spring program arguments & VM options ](#Spring-program-arguments-&-VM-options)
174. [Property Placeholders & Default values ](#Property-Placeholders-&-Default-values)
175. [spring.config.location ](#spring.config.location)

## [lesson 37. Yaml format ](#lesson-37.-Yaml-format)

176. [YAML - Yet Another Markup Language ](#YAML---Yet-Another-Markup-Language)
177. [Класс YamlPropertiesFactoryBean ](#Класс-YamlPropertiesFactoryBean)
178. [Приоритет properties vs yaml ](#Приоритет-properties-vs-yaml)
179. [Переписывание application.properties на yaml ](#Переписывание-application.properties-на-yaml)


## [lesson 38. @ConfigurationProperties ](#lesson-38.-@ConfigurationProperties)

180. [Класс JpaProperties ](#Класс-JpaProperties)
181. [Класс DatabaseProperties ](#Класс-DatabaseProperties)
182. [Аннотация @ConfigurationProperties ](#Аннотация-@ConfigurationProperties)
183. [Аннотация @ConfigurationPropertiesScan ](#Аннотация-@ConfigurationPropertiesScan)
184. [Immutable DatabaseProperties ](#Immutable-DatabaseProperties)
185. [DatabaseProperties as record ](#DatabaseProperties-as-record)
186. [Property key names ](#Property-key-names)



# [7. Logging Starter ](#7.-Logging-Starter)


## [lesson 39. Logging Starter ](#lesson-39.-Logging-Starter)

190. [Application as a Black Box ](#Application-as-a-Black-Box)
191. [Logging libraries ](#Logging-libraries)
192. [Log Levels ](#Log-Levels)
193. [spring-boot-starter-logging dependency ](#spring-boot-starter-logging-dependency)
194. [Аннотация @Slf4j ](#Аннотация-@Slf4j)
195. [Delombok annotations ](#Delombok-annotations)
196. [Формат логов по умолчанию ](#Формат-логов-по-умолчанию)
197. [logging.* properties ](#logging.*-properties)

## [lesson 40. Logback Configuration ](#lesson-40.-Logback-Configuration)

198. [Logback default xml configs ](#Logback-default-xml-configs)
199. [File Output ](#File-Output)
200. [Custom log configuration ](#Custom-log-configuration)


# [8. Test Starter ](#8.-Test-Starter)

## [lesson 41. Test Starter ](#lesson-41.-Test-Starter)

201. [Подключение spring-boot-starter-test ](#Подключение-spring-boot-starter-test)
202. [Транзитивные зависимости spring-boot-starter-test ](#Транзитивные-зависимости-spring-boot-starter-test)
203. [Зависимость spring-test ](#Зависимость-spring-test)
204. [Зависимость spring-boot-test ](#Зависимость-spring-boot-test)
205. [Зависимость spring-boot-test-autoconfigure ](#Зависимость-spring-boot-test-autoconfigure)
206. [Пример написания Unit тестов ](#Пример-написания-Unit-тестов)
207. [Java Gradle Plugin tasks relationship ](#Java-Gradle-Plugin-tasks-relationship)

## [lesson 42. Integration Testing. Part 1 ](#lesson-42.-Integration-Testing.-Part-1)

208. [Основные цели Spring Integration Testing ](#Основные-цели-Spring-Integration-Testing)
209. [Жизненный цикл тестов ](#Жизненный-цикл-тестов)
210. [JUnit 5 Extension Model ](#JUnit-5-Extension-Model)
211. [TestContext Framework ](#TestContext-Framework)
212. [SpringExtension source code ](#SpringExtension-source-code)

## [lesson 43. Integration Testing. Part 2 ](#lesson-43.-Integration-Testing.-Part-2)

213. [Создание CompanyServiceIT ](#Создание-CompanyServiceIT)
214. [SpringExtension via @ExtendWith ](#SpringExtension-via-@ExtendWith)
215. [Аннотация @ContextConfiguration ](#Аннотация-@ContextConfiguration)
216. [Аннотация @TestPropertySource ](#Аннотация-@TestPropertySource)
217. [Класс ApplicationContextInitializer ](#Класс-ApplicationContextInitializer)
218. [Аннотация @SpringBootTest ](#Аннотация-@SpringBootTest)
219. [Написание первого интеграционного теста ](#Написание-первого-интеграционного-теста)
220. [Класс DependencyInjectionTestExecutionListener ](#Класс-DependencyInjectionTestExecutionListener)

## [lesson 44. Integration Testing. Part 3 ](#lesson-44.-Integration-Testing.-Part-3)

221. [Аннотация @ActiveProfiles ](#Аннотация-@ActiveProfiles)
222. [Custom Test Annotations ](#Custom-Test-Annotations)
223. [Аннотация @TestConstructor ](#Аннотация-@TestConstructor)
224. [Замена @TestConstructor на spring.properties ](#Замена-@TestConstructor-на-spring.properties)

## [lesson 45. Context Caching ](#lesson-45.-Context-Caching)

225. [Создание нескольких ApplicationContext в тестах ](#Создание-нескольких-ApplicationContext-в-тестах)
226. [Аннотации @MockBean и @SpyBean ](#Аннотации-@MockBean-и-@SpyBean)
227. [Класс MockitoTestExecutionListener ](#Класс-MockitoTestExecutionListener)
228. [Аннотация @TestConfiguration ](#Аннотация-@TestConfiguration)
229. [Аннотация @DirtiesContext ](#Аннотация-@DirtiesContext)


# [9. Data JPA Starter ](#9.-Data-JPA-Starter)

## [lesson 46. Data JPA Starter. Введение ](#lesson-46.-Data-JPA-Starter.-Введение)
230. [Чего не хватало в Hibernate ](#Чего-не-хватало-в-Hibernate)
231. [Установка PostgreSQL ](#Установка-PostgreSQL)
232. [Установка Docker ](#Установка-Docker)
233. [Postgres Docker Image ](#Postgres-Docker-Image)
234. [Подключение к postgres из IntelliJ IDEA ](#Подключение-к-postgres-из-IntelliJ-IDEA)

## [lesson 47. Data JPA Starter. Подключение ](#lesson-47.-Data-JPA-Starter.-Подключение)

235. [Подключение spring-boot-starter-data-jpa ](#Подключение-spring-boot-starter-data-jpa)
236. [Зависимости spring-boot-starter-data-jpa ](#Зависимости-spring-boot-starter-data-jpa)
237. [Класс HibernateJpaAutoConfiguration ](#Класс-HibernateJpaAutoConfiguration)
238. [Настройка spring.datasource и spring.jpa properties ](#Настройка-spring.datasource-и-spring.jpa-properties)
239. [Тестирование приложения ](#Тестирование-приложения)

## [lesson 48. Hibernate Entities ](#lesson-48.-Hibernate-Entities)

240. [UML диаграмма выполненных sql скриптов ](#UML-диаграмма-выполненных-sql-скриптов)
241. [Создание сущности Company ](#Создание-сущности-Company)
242. [Создание коллекции locales (ElementCollection) ](#Создание-коллекции-locales-(ElementCollection))
243. [Создание сущности User ](#Создание-сущности-User)
244. [Создание сущности Payment ](#Создание-сущности-Payment)
245. [Создание сущности Chat ](#Создание-сущности-Chat)
246. [Создание сущности UserChat ](#Создание-сущности-UserChat)
247. [Проверка маппинга сущностей через hbm2ddl.auto ](#Проверка-маппинга-сущностей-через-hbm2ddl.auto)
248. [Аннотация @EntityScan ](#Аннотация-@EntityScan)


# [10. Data JPA Transactions ](#10.-Data-JPA-Transactions)

## [lesson 49. @Transactional. TestContext ](#lesson-49.-@Transactional.-TestContext)
249. [Общая структура работы с TransactionManager ](#Общая-структура-работы-с-TransactionManager)
250. [Создание CompanyRepository IT ](#Создание-CompanyRepository-IT)
251. [Аннотации @Transactional из Jakarta EE и Spring ](#Аннотации-@Transactional-из-Jakarta-EE-и-Spring)
252. [Класс TransactionalTestExecutionListener ](#Класс-TransactionalTestExecutionListener)
253. [Аннотации @Commit и @Rollback ](#Аннотации-@Commit-и-@Rollback)

## [lesson 50. TransactionAutoConfiguration ](#lesson-49.-@Transactional.-TestContext)
254. [Класс TransactionAutoConfigurationКак происходит обработка транзакций в proxy ](#Класс-TransactionAutoConfigurationКак-происходит-обработка-транзакций-в-proxy)
255. [Аннотация @Transactional и Cglib proxy ](#Аннотация-@Transactional-и-Cglib-proxy)
256. [Как работает Cglib proxy с TransactionManager ](#Как-работает-Cglib-proxy-с-TransactionManager)
257. [Как подключить механизм транзакций внутри объекта (не proxy) ](#Как-подключить-механизм-транзакций-внутри-объекта-(не-proxy))
258. [Механизм транзакций между несколькими Cglib proxy ](#Механизм-транзакций-между-несколькими-Cglib-proxy)

## [lesson 51. @Transactional Settings ](#lesson-51.-@Transactional-Settings)
259. [Свойства @Transactional. transactionManager ](#Свойства-@Transactional.-transactionManager)
260. [Transaction propagation ](#Transaction-propagation)
261. [Transaction propagation резюме ](#Transaction-propagation-резюме)
262. [Transaction isolation ](#Transaction-isolation)
263. [Transaction timeout ](#Transaction-timeout)
264. [ReadOnly transaction ](#ReadOnly-transaction)
265. [Transaction rollbackFor & rollbackForClassName ](#Transaction-rollbackFor-&-rollbackForClassName)
266. [Transaction noRollbackFor & noRollbackForClassName ](#Transaction-noRollbackFor-&-noRollbackForClassName)


## [lesson 52. Manual Transactions ](#lesson-52.-Manual-Transactions)
267. [Свойства объекта TransactionTemplate ](#Свойства-объекта-TransactionTemplate)
268. [Функционал TransactionTemplate ](#Функционал-TransactionTemplate)
269. [Обработка checked exceptions ](#Обработка-checked-exceptions)
270. [Взаимодействие TransactionTemplate с другими Proxy ](#Взаимодействие-TransactionTemplate-с-другими-Proxy)
271. [Вынесение @Transactional в @IT ](#Вынесение-@Transactional-в-@IT)


# [11. Data JPA Repositories ](#11.-Data-JPA-Repositories)

## [lesson 53. Repository ](#lesson-53.-Repository)
272. [Интерфейс Repository ](#Интерфейс-Repository)
273. [Написание теста на удаление Company ](#Написание-теста-на-удаление-Company)
274. [Класс JpaRepositoryAutoConfiguration ](#Класс-JpaRepositoryAutoConfiguration)

## [lesson 54. RepositoryQuery ](#lesson-54.-RepositoryQuery)
275. [Создание Proxy на классы Repository ](#Создание-Proxy-на-классы-Repository)
276. [Класс QueryExecutorMethodInterceptor ](#Класс-QueryExecutorMethodInterceptor)
277. [Класс RepositoryQuery ](#Класс-RepositoryQuery)
278. [Наследники Repository ](#Наследники-Repository)

## [lesson 55. PartTreeJpaQuery ](#lesson-55.-PartTreeJpaQuery)
279. [Класс PartTreeJpaQuery ](#Класс-PartTreeJpaQuery)
280. [Примеры написания запросов ](#Примеры-написания-запросов)
281. [Тестирование запросов ](#Тестирование-запросов)
282. [Весь список ключевых слов PartTreeJpaQuery ](#Весь-список-ключевых-слов-PartTreeJpaQuery)


## [lesson 56. NamedQuery ](#lesson-56.-NamedQuery)

283. [Недостатки PartTreeJpaQuery ](#Недостатки-PartTreeJpaQuery)
284. [Класс NamedQuery ](#Класс-NamedQuery)
285. [Аннотация @NamedQuery ](#Аннотация-@NamedQuery)
286. [Тестирование NamedQuery ](#Тестирование-NamedQuery)
287. [Аннотация @Param ](#Аннотация-@Param)

## [lesson 57. @Query ](#lesson-57.-@Query)
288. [StoredProcedureJpaQuery ](#StoredProcedureJpaQuery)
289. [Аннотация @Query ](#Аннотация-@Query)
290. [Демонстрация работы @Query ](#Демонстрация-работы-@Query)
291. [Усовершенствованный оператор LIKE ](#Усовершенствованный-оператор-LIKE)
292. [Native Query ](#Native-Query)

## [lesson 58. @Modifying ](#lesson-58.-@Modifying)

293. [Запрос на обновление через @Query ](#Запрос-на-обновление-через-@Query)
294. [Аннотация @Modifying ](#Аннотация-@Modifying)
295. [Hibernate PersistenceContext ](#Hibernate-PersistenceContext)
296. [Свойства clearAutomatically и flushAutomatically ](#Свойства-clearAutomatically-и-flushAutomatically)
297. [clearAutomatically и LazyInitializationException ](#clearAutomatically-и-LazyInitializationException)

## [lesson 59. Special parameters ](#lesson-59.-Special-parameters)

298. [Top & First](#Top-&-First)
299. [TopN & FirstN](#TopN-&-FirstN)
300. [Класс Sort](#Класс-Sort)
301. [Класс Pageable ](#Класс-Pageable)

## [lesson 60. Page & Slice ](#lesson-60.-Page-&-Slice)
302. [Spring классы Streamable, Slice, Page ](#Spring-классы-Streamable,-Slice,-Page)
303. [Демонстрация работы Slice объекта ](#Демонстрация-работы-Slice-объекта)
304. [Почему Slice объекта недостаточно ](#Почему-Slice-объекта-недостаточно)
305. [Демонстрация работы Page объекта ](#Демонстрация-работы-Page-объекта)

## [lesson 61. @EntityGraph ](#lesson-61.-@EntityGraph)

306. [Аннотация @EntityGraph ](#Аннотация-@EntityGraph)
307. [Именованные графы @NamedEntityGraph ](#Именованные-графы-@NamedEntityGraph)
308. [Свойство attributePaths в @EntityGraph ](#Свойство-attributePaths-в-@EntityGraph)
309. [Конфликт Pageable при получении EAGER связей ](#Конфликт-Pageable-при-получении-EAGER-связей)

## [lesson 62. @Lock & @QueryHints ](#lesson-62.-@Lock-&-@QueryHints)

310. [Аннотация @Lock ](#Аннотация-@Lock)
311. [Демонстрация пессимистических блокировок ](#Демонстрация-пессимистических-блокировок)
312. [Аннотация @QueryHints ](#Аннотация-@QueryHints)

## [lesson 63. Projection ](#lesson-63.-Projection)

313. [Class-based Projections ](#Class-based-Projections)
314. [Generic Class-based Projections ](#Generic-Class-based-Projections)
315. [Interface-based Projections ](#Interface-based-Projections)
316. [SpEL in Projections ](#SpEL-in-Projections)

## [lesson 64. Custom Repository Implementation ](#lesson-64.-Custom-Repository-Implementation)

317. [Запрос фильтрации через Custom Implementation ](#Запрос-фильтрации-через-Custom-Implementation)
318. [Criteria API для запроса фильтрации ](#Criteria-API-для-запроса-фильтрации)
319. [Аннотация @EnableJpaRepository ](#Аннотация-@EnableJpaRepository)
320. [Тестирование запроса фильтрации ](#Тестирование-запроса-фильтрации)

## [lesson 65. JPA Auditing ](#lesson-65.-JPA-Auditing)
321. [Создание AuditingEntity ](#Создание-AuditingEntity)
322. [Аннотация @EnableJpaAuditing ](#Аннотация-@EnableJpaAuditing)
323. [Тестирование @CreatedDate и @LastModifiedDate ](#Тестирование-@CreatedDate-и-@LastModifiedDate)
324. [Аннотации @CreatedBy и @LastModifiedBy ](#Аннотации-@CreatedBy-и-@LastModifiedBy)
325. [Создание AuditorAware Bean ](#Создание-AuditorAware-Bean)
326. [Тестирование @CreatedBy и @LastModifiedBy ](#Тестирование-@CreatedBy-и-@LastModifiedBy)

## [lesson 66. Hibernate Envers ](#lesson-66.-Hibernate-Envers)
327. [Подключение Hibernate Envers ](#Подключение-Hibernate-Envers)
328. [Создание сущности Revision ](#Создание-сущности-Revision)
329. [Аннотация @Audited ](#Аннотация-@Audited)
330. [Аннотация @EnableEnversRepositories ](#Аннотация-@EnableEnversRepositories)
331. [Тестирование Hibernate Envers ](#Тестирование-Hibernate-Envers)
332. [Класс RevisionRepository ](#Класс-RevisionRepository)


## [lesson 67. Querydsl ](#lesson-67.-Querydsl)

333. [Подключение Querydsl ](#Подключение-Querydsl)
334. [Создание QPredicates ](#Создание-QPredicates)
335. [Замена Criteria API на Querydsl ](#Замена-Criteria-API-на-Querydsl)
336. [Тестирование Querydsl ](#Тестирование-Querydsl)
337. [Класс QuerydslPredicateExecutor ](#Класс-QuerydslPredicateExecutor)


# [12. JDBC Starter ](#12.-JDBC-Starter)


## [lesson 68. JDBC Starter ](#lesson-68.-JDBC-Starter)
338. [Зависимость spring-boot-starter-jdbc ](#Зависимость-spring-boot-starter-jdbc)
339. [JdbcTemplateAutoConfiguration ](#JdbcTemplateAutoConfiguration)
340. [Функционал класса JdbcTemplate ](#Функционал-класса-JdbcTemplate)
341. [Практика JdbcTemplate ](#Практика-JdbcTemplate)
342. [Тестирование функционала ](#Тестирование-функционала)
343. [Подключение логов для JdbcTemplate ](#Подключение-логов-для-JdbcTemplate)


## [lesson 69. Batch size & Fetch size ](#lesson-69.-Batch-size-&-Fetch-size)
344. [Batch запросы ](#Batch-запросы)
345. [Batch запрос через JdbcTemplate ](#Batch-запрос-через-JdbcTemplate)
346. [Тестирование Batch запроса через JdbcTemplate ](#Тестирование-Batch-запроса-через-JdbcTemplate)
347. [Batch запрос через NamedParameterJdbcTemplate ](#Batch-запрос-через-NamedParameterJdbcTemplate)
348. [Установка batch_size в Hibernate ](#Установка-batch_size-в-Hibernate)
349. [Fetch size ](#Fetch-size)




# [13. Databases in tests ](#13.-Databases-in-tests)

## [lesson 70. In-Memory databases. H2 ](#lesson-70.-In-Memory-databases.-H2)
350. [Два варианта поднятия тестовой базы данных ](#Два-варианта-поднятия-тестовой-базы-данных)
351. [Подключение H2 database ](#Подключение-H2-database)
352. [Аннотация @Sql ](#Аннотация-@Sql)

## [lesson 71. Testcontainers ](#lesson-71.-Testcontainers)
353. [testcontainers lib ](#testcontainers-lib)
354. [Подключение testcontainers ](#Подключение-testcontainers)
355. [Создание IntegrationTestBase ](#Создание-IntegrationTestBase)
356. [Тестирование testcontainers ](#Тестирование-testcontainers)
357. [Тестовые данные (ids) ](#Тестовые-данные-(ids))



# [14. Database Migrations ](#14.-Database-Migrations)

## [lesson 72. Liquibase. Теория ](#lesson-72.-Liquibase.-Теория)
358. [Устройство migration frameworks ](#Устройство-migration-frameworks)
359. [Стуктура Liquibase changelog ](#Стуктура-Liquibase-changelog)
360. [Changelog master file ](#Changelog-master-file)

## [lesson 73. Liquibase. Практика ](#lesson-73.-Liquibase.-Практика)

361. [Подключение зависимости liquibase-core ](#Подключение-зависимости-liquibase-core)
362. [Класс LiquibaseAutoConfiguration ](#Класс-LiquibaseAutoConfiguration)
363. [Создание master changelog ](#Создание-master-changelog)
364. [liquibase formatted sql ](#liquibase-formatted-sql)
365. [Тестирование Liquibase ](#Тестирование-Liquibase)
366. [Добавление нового changelog (envers tables) ](#Добавление-нового-changelog-(envers-tables))
367. [md5sum ](#md5sum)
368. [Использование Liquibase в тестах ](#Использование-Liquibase-в-тестах)


# [15. Web Starter ](#15.-Web-Starter)

## [lesson 74. Web Starter. Введение ](#lesson-74.-Web-Starter.-Введение)
369. [MVC и классические web-приложения ](#MVC-и-классические-web-приложения)
370. [web-приложение на Spring Boot ](#web-приложение-на-Spring-Boot)
371. [Embedded Tomcat ](#Embedded-Tomcat)
372. [Настройка spring-web приложения ](#Настройка-spring-web-приложения)
373. [Класс WebMvcAutoConfiguration ](#Класс-WebMvcAutoConfiguration)


## [lesson 75. Dispatcher Servlet ](#lesson-75.-Dispatcher-Servlet)
374. [Жизненный цикл сервлетов ](#Жизненный-цикл-сервлетов)
375. [Псевдокод метода service в DispatcherServlet ](#Псевдокод-метода-service-в-DispatcherServlet)
376. [Исходный код класса DispatcherServlet ](#Исходный-код-класса-DispatcherServlet)


## [lesson 76. @Controller ](#lesson-76.-@Controller)
377. [Подключение зависимостей и настройка view resolver ](#Подключение-зависимостей-и-настройка-view-resolver)
378. [Создание контроллера. @Controller ](#Создание-контроллера.-@Controller)


## [lesson 77. @RequestMapping ](#lesson-77.-@RequestMapping)
379. [Основные составляющие HTTP запроса и HTTP ответа ](#Основные-составляющие-HTTP-запроса-и-HTTP-ответа)
380. [Основные составляющие URL ](#Основные-составляющие-URL)
381. [Аннотации @RequestMapping ](#Аннотации-@RequestMapping)


## [lesson 78. Parameters, Headers, Cookies ](#lesson-78.-Parameters,-Headers,-Cookies)
382. [Parameters. @RequestParam annotation ](#Parameters.-@RequestParam-annotation)
383. [Headers. @RequestHeader annotation ](#Headers.-@RequestHeader-annotation)
384. [Cookies. @CookieValue annotation ](#Cookies.-@CookieValue-annotation)
385. [Method params naming ](#Method-params-naming)
386. [DispatcherServlet sources ](#DispatcherServlet-sources)
387. [@PathVariable annotation ](#@PathVariable-annotation)


## [lesson 79. Model ](#lesson-79.-Model)
388. [Attributes ](#Attributes)
389. [Добавление Request атрибутов в Model ](#Добавление-Request-атрибутов-в-Model)
390. [Добавление Session атрибутов в Model ](#Добавление-Session-атрибутов-в-Model)
391. [DispatcherServlet sources ](#DispatcherServlet-sources)


## [lesson 80. @ModelAttribute ](#lesson-80.-@ModelAttribute)
392. [Упрощение работы с объектом ModelAndView ](#Упрощение-работы-с-объектом-ModelAndView)
393. [Динамическое создание атрибутов ](#Динамическое-создание-атрибутов)
394. [Аннотация @ModelAttribute ](#Аннотация-@ModelAttribute)
395. [HTML Form. LoginController ](#HTML-Form.-LoginController)


## [lesson 81. Forward, Include, Redirect ](#lesson-81.-Forward,-Include,-Redirect)
396. [3 вида перенаправления запросов ](#3-вида-перенаправления-запросов)
397. [forward in Spring ](#forward-in-Spring)
398. [redirect in Spring ](#redirect-in-Spring)

## [lesson 82. CRUD. API Design ](#lesson-82.-CRUD.-API-Design)
399. [API design best practices ](#API-design-best-practices)
400. [CRUD. Method findAll ](#CRUD.-Method-findAll)
401. [CRUD. Method findById ](#CRUD.-Method-findById)
402. [CRUD. Method create ](#CRUD.-Method-create)
403. [CRUD. Method update ](#CRUD.-Method-update)
404. [CRUD. Method delete ](#CRUD.-Method-delete)


## [lesson 83. CRUD. Service Layer ](#lesson-83.-CRUD.-Service-Layer)
405. [UserService. Method findAll ](#UserService.-Method-findAll)
406. [UserService. Method findById ](#UserService.-Method-findById)
407. [UserService. Method create ](#UserService.-Method-create)
408. [@Transactional annotation ](#@Transactional-annotation)
409. [UserService. Method update ](#UserService.-Method-update)
410. [UserService. Method delete ](#UserService.-Method-delete)
411. [Test UserService functionality ](#Test-UserService-functionality)
412. [Tips. Method delete ](#Tips.-Method-delete)

## [lesson 84. Spring MVC Testing ](#lesson-84.-Spring-MVC-Testing)

413. [Аннотация @AutoConfigureMockMvc ](#Аннотация-@AutoConfigureMockMvc)
414. [Test findAll method ](#Test-findAll-method)
415. [Transactions. spring.jpa.open-in-view property ](#Transactions.-spring.jpa.open-in-view-property)
416. [Test create method ](#Test-create-method)
417. [Problem with sending dates in params ](#Problem-with-sending-dates-in-params)

## [lesson 85. Type Converters ](#lesson-85.-Type-Converters)
418. [spring.mvc.format properties ](#spring.mvc.format-properties)
419. [Аннотация @DateTimeFormat ](#Аннотация-@DateTimeFormat)
420. [Интерфейс WebMvcConfigurer ](#Интерфейс-WebMvcConfigurer)


# [16. Thymeleaf ](#16.-Thymeleaf)

## [lesson 86. Thymeleaf Starter. Введение ](#lesson-86.-Thymeleaf-Starter.-Введение)
421. [View Resolvers ](#View-Resolvers)
422. [Thymeleaf Template Engine Intro ](#Thymeleaf-Template-Engine-Intro)
423. [Настройка Thymeleaf в проекте ](#Настройка-Thymeleaf-в-проекте)
424. [Использование Thymeleaf ](#Использование-Thymeleaf)
425. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 87. CRUD. View Layer. Часть 1 ](#lesson-87.-CRUD.-View-Layer.-Часть-1)
426. [Создание users.html для метода findAll ](#Создание-users.html-для-метода-findAll)
427. [Создание user.html для метода findById ](#Создание-user.html-для-метода-findById)
428. [Тестирование функционала ](#Тестирование-функционала)
429. [Добавление кнопки для метода delete ](#Добавление-кнопки-для-метода-delete)

## [lesson 88. CRUD. View Layer. Часть 2 ](#lesson-88.-CRUD.-View-Layer.-Часть-2)
430. [Создание registration endpoint ](#Создание-registration-endpoint)
431. [Создание registration.html ](#Создание-registration.html)
432. [Тестирование функционала registration ](#Тестирование-функционала-registration)
433. [redirect с сохранением введенных параметров ](#redirect-с-сохранением-введенных-параметров)

## [lesson 89. Filter Query ](#lesson-89.-Filter-Query)
434. [Add UserFilter - Controller & Service layers ](#Add-UserFilter---Controller-&-Service-layers)
435. [Add UserFilter - users.html ](#Add-UserFilter---users.html)
436. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 90. Pagination. Best practices ](#lesson-90.-Pagination.-Best-practices)
437. [HTTP endpoints best practices ](#HTTP-endpoints-best-practices)
438. [2 options of pagination implementation ](#2-options-of-pagination-implementation)
439. [offset-based pagination ](#offset-based-pagination)
440. [PageableArgumentResolver ](#PageableArgumentResolver)
441. [Building PageResponse ](#Building-PageResponse)
442. [Тестирование функционала ](#Тестирование-функционала)


# [17. Validation Starter ](#17.-Validation-Starter)

## [lesson 91. Validation Starter. Введение ](#lesson-91.-Validation-Starter.-Введение)
443. [Подключение validation starter ](#Подключение-validation-starter)
444. [Validation annotations ](#Validation-annotations)
445. [How to use annotations in practice ](#How-to-use-annotations-in-practice)
446. [@Valid & @Validated ](#@Valid-&-@Validated)
447. [BindingResult object ](#BindingResult-object)
448. [Show validation errors on the page ](#Show-validation-errors-on-the-page)
449. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 92. Custom validator ](#lesson-92.-Custom-validator)
450. [Main parts in JSR 303 annotations ](#Main-parts-in-JSR-303-annotations)
451. [Custom annotation @UserInfo ](#Custom-annotation-@UserInfo)
452. [Тестирование функционала ](#Тестирование-функционала)
453. [Configuration properties validation ](#Configuration-properties-validation)
454. [Validation groups ](#Validation-groups)

## [lesson 93. @ControllerAdvice & @ExceptionHandler ](#lesson-93.-@ControllerAdvice-&-@ExceptionHandler)
455. [@ExceptionHandler annotation ](#@ExceptionHandler-annotation)
456. [Тестирование функционала ](#Тестирование-функционала)
457. [@ControllerAdvice annotation ](#@ControllerAdvice-annotation)
458. [Класс ResponseEntityExceptionHandler ](#Класс-ResponseEntityExceptionHandler)


# [18. REST ](#18.-REST)

## [lesson 94. REST. Введение ](#lesson-94.-REST.-Введение)
459. [Проблемы Controller API ](#Проблемы-Controller-API)
460. [REST API ](#REST-API)
461. [REST API Usages ](#REST-API-Usages)

## [lesson 95. REST. Практика ](#lesson-95.-REST.-Практика)
462. [@ResponseBody & findAll method ](#@ResponseBody-&-findAll-method)
463. [findById method ](#findById-method)
464. [@RequestBody & create method ](#@RequestBody-&-create-method)
465. [update method ](#update-method)
466. [delete method ](#delete-method)
467. [@RestController ](#@RestController)
468. [@RestControllerAdvice ](#@RestControllerAdvice)

## [lesson 96. Swagger. API docs ](#lesson-96.-Swagger.-API-docs)
469. [Rest clients ](#Rest-clients)
470. [Подключение springdoc ](#Подключение-springdoc)
471. [Сгенерированная документация для Rest Controllers ](#Сгенерированная-документация-для-Rest-Controllers)
472. [Swagger ui ](#Swagger-ui)
473. [Swagger annotations ](#Swagger-annotations)

## [lesson 97. Upload image ](#lesson-97.-Upload-image)
474. [Добавление новой колонки image в таблице users ](#Добавление-новой-колонки-image-в-таблице-users)
475. [Создание ImageService ](#Создание-ImageService)
476. [upload images from html pages. MultipartFile ](#upload-images-from-html-pages.-MultipartFile)
477. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 98. Get image ](#lesson-98.-Get-image)
478. [Реализация функционала на уровне service ](#Реализация-функционала-на-уровне-service)
479. [Отображение картинки на html странице ](#Отображение-картинки-на-html-странице)
480. [Реализация функционала на уровне rest controller ](#Реализация-функционала-на-уровне-rest-controller)
481. [Тестирование функционала ](#Тестирование-функционала)
482. [Отображение отсутствующей картинки ](#Отображение-отсутствующей-картинки)
483. [Класс ResponseEntity ](#Класс-ResponseEntity)

# [19. Security Starter ](#19.-Security-Starter)

## [lesson 99. Security Starter. Введение ](#lesson-99.-Security-Starter.-Введение)
484. [Понятия Аутентификация и Авторизация ](#Понятия-Аутентификация-и-Авторизация)
485. [Servlet Filters mechanism ](#Servlet-Filters-mechanism)
486. [Spring Servlet Filters mechanism ](#Spring-Servlet-Filters-mechanism)
487. [Подключение Spring Security Starter ](#Подключение-Spring-Security-Starter)

## [lesson 100. Authentication Architecture ](#lesson-100.-Authentication-Architecture)
488. [Spring Security Model ](#работа-для-студентов)
489. [Spring Security Authentication Logic ](#работа-для-студентов)
490. [Debug Security filters (default behaviour) ](#работа-для-студентов)

## [lesson 101. DaoAuthenticationProvider ](#lesson-101.-DaoAuthenticationProvider)
491. [DaoAuthenticationProvider source code ](#DaoAuthenticationProvider-source-code)
492. [Add column password into users table ](#Add-column-password-into-users-table)
493. [Update entity & enum ](#Update-entity-&-enum)
494. [Implement UserDetailsService ](#Implement-UserDetailsService)
495. [Тестирование функциональности ](#Тестирование-функциональности)

## [lesson 102. Form Login ](#lesson-102.-Form-Login)
496. [Default login page source code ](#Default-login-page-source-code)
497. [Custom login page ](#Custom-login-page)
498. [Customise SecurityFilterChain ](#Customise-SecurityFilterChain)
499. [Тестирование функицонала ](#Тестирование-функицонала)
500. [Class UsernamePasswordAuthenticationFilter ](#Class-UsernamePasswordAuthenticationFilter)

## [lesson 103. HTTP Basic Authentication ](#lesson-103.-HTTP-Basic-Authentication)

501. [HTTP Basic Authentication principle ](#HTTP-Basic-Authentication-principle)
502. [HTTP Basic encoder & decoder ](#HTTP-Basic-encoder-&-decoder)
503. [Customise SecurityFilterChain to support HTTP Basic ](#Customise-SecurityFilterChain-to-support-HTTP-Basic)
504. [BasicAuthenticationFilter source code ](#BasicAuthenticationFilter-source-code)

## [lesson 104. PasswordEncoder ](#lesson-104.-PasswordEncoder)
505. [Зачем шифровать пароли ](#Зачем-шифровать-пароли)
506. [List of password encoders ](#List-of-password-encoders)
507. [Implement password encode/decode in the app ](#Implement-password-encode/decode-in-the-app)
508. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 105. Logout ](#lesson-105.-Logout)

509. [LogoutFilter source code ](#LogoutFilter-source-code)
510. [Customise logout in SecurityFilterChain ](#Customise-logout-in-SecurityFilterChain)
511. [Add button Logout on pages ](#Add-button-Logout-on-pages)
512. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 106. Authorization Architecture ](#lesson-106.-Authorization-Architecture)
513. [AuthorizationFilter source code and logic ](#LogoutFilter-source-code)
514. [AuthorizationFilter implementations ](#Customise-logout-in-SecurityFilterChain)
515. [Customise authorizeHttpRequests in SecurityFilterChain ](#Add-button-Logout-on-pages)
516. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 107. Method Security ](#lesson-107.-Method-Security)

517. [@PreAuthorize annotation ](#@PreAuthorize-annotation)
518. [@PostAuthorize annotation ](#@PostAuthorize-annotation)
519. [@EnableMethodSecurity annotation ](#@EnableMethodSecurity-annotation)
520. [@Secured annotation ](#@Secured-annotation)
521. [Service layer authentication ](#Service-layer-authentication)
522. [@PreFilter & @PostFilter annotations ](#@PreFilter-&-@PostFilter-annotations)


## [lesson 108. Access to authenticated user ](#lesson-108.-Access-to-authenticated-user)

523. [Get current user via SecurityContextHolder ](#Get-current-user-via-SecurityContextHolder)
524. [@CurrentSecutiryContext annotation ](#@CurrentSecutiryContext-annotation)
525. [@AuthenticationPrincipal annotation ](#@AuthenticationPrincipal-annotation)
526. [Thymeleaf and Spring Security integration ](#Thymeleaf-and-Spring-Security-integration)

## [lesson 109. CSRF Filter ](#lesson-109.-CSRF-Filter)
527. [Cross-Site Request Forgery ](#Cross-Site-Request-Forgery)
528. [How to solve CSRF problem ](#How-to-solve-CSRF-problem)
529. [Synchronizer Token Pattern ](#Synchronizer-Token-Pattern)
530. [When to use CSRF protection ](#When-to-use-CSRF-protection)
531. [CsrfFilter source code ](#CsrfFilter-source-code)
532. [How to work with CSRF token ](#How-to-work-with-CSRF-token)
533. [Class CsrfRequestDataValueProcessor ](#Class-CsrfRequestDataValueProcessor)
534. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 110. Security Testing ](#lesson-110.-Security-Testing)

536. [Исправление существующих тестов ](#Исправление-существующих-тестов)
537. [spring-security-test dependency ](#spring-security-test-dependency)
538. [1. Manually define a user in tests ](#1.-Manually-define-a-user-in-tests)
539. [2. @WithMockUser annotation ](#2.-@WithMockUser-annotation)
540. [3. SecurityMockMvcRequestPostProcessor ](#3.-SecurityMockMvcRequestPostProcessor)

## [lesson 111. OAuth 2.0. Теория ](#lesson-111.-OAuth-2.0.-Теория)

541. [Текущий Authentication функционал в приложении ](#Текущий-Authentication-функционал-в-приложении)
542. [Что такое OAuth 2 ](#Что-такое-OAuth-2)
543. [Как внедрить OAuth 2 в приложении ](#Как-внедрить-OAuth-2-в-приложении)
544. [OAuth 2 flow types ](#OAuth-2-flow-types)
545. [OAuth 2 Authorization Code Flow ](#OAuth-2-Authorization-Code-Flow)
546. [OAuth 2 Implicit Flow ](#OAuth-2-Implicit-Flow)
547. [OpenID Connect (OIDC) ](#OpenID-Connect-(OIDC))

## [lesson 112. OAuth 2.0. Практика ](#lesson-112.-OAuth-2.0.-Практика)

548. [Create a new project in GCP ](#Create-a-new-project-in-GCP)
549. [Configure OAuth 2 in the project ](#Configure-OAuth-2-in-the-project)
550. [Configure Login Page ](#Configure-Login-Page)
551. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 113. OAuth 2.0. Authentication Principle ](#lesson-113.-OAuth-2.0.-Authentication-Principle)

552. [Add UserInfoEndpoint config in SecurityFilterChain ](#Add-UserInfoEndpoint-config-in-SecurityFilterChain)
553. [Create oidcUserService ](#Create-oidcUserService)
554. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 114. JWT. JSON Web Token ](#lesson-114.-JWT.-JSON-Web-Token)


555. [How to extract info from JWT ](#How-to-extract-info-from-JWT)
556. [JWT header ](#JWT-header)
557. [JWT payload ](#JWT-payload)
558. [JWT signature ](#JWT-signature)
559. [Code Book ](#Code-Book)

## [lesson 115. Swagger Authorization ](#lesson-115.-Swagger-Authorization)
560. [3 options to pass authorization in Swagger ](#3-options-to-pass-authorization-in-Swagger)
561. [springdoc properties to support OAuth 2 ](#springdoc-properties-to-support-OAuth-2)
562. [@SecurityScheme configuration ](#@SecurityScheme-configuration)
563. [Тестирование функционала ](#Тестирование-функционала)



# [20. i18n & l10n ](#20.-i18n-&-l10n)


## [lesson 116. i18n. MessageSource ](#lesson-116.-i18n.-MessageSource)

564. [spring.messages properties ](#spring.messages-properties)
565. [IntelliJ IDEA UTF-8 settings ](#IntelliJ-IDEA-UTF-8-settings)
566. [Creating MessageRestController ](#Creating-MessageRestController)
567. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 117. i18n. Thymeleaf ](#lesson-117.-i18n.-Thymeleaf)

568. [Login page i18n ](#Login-page-i18n)
569. [How to change the language ](#How-to-change-the-language)
570. [LocalChangeInterceptor bean ](#LocalChangeInterceptor-bean)
571. [LocaleResolver bean ](#LocaleResolver-bean)
572. [Тестирование функционала ](#Тестирование-функционала)

# [21. AOP Starter ](#21.-AOP-Starter)

## [lesson 118. AOP Starter. Введение ](#lesson-118.-AOP-Starter.-Введение)
573. [Усложнение кода второстепенной логикой ](#Усложнение-кода-второстепенной-логикой)
574. [Crosscutting concerns ](#Crosscutting-concerns)
575. [AOP terminology ](#AOP-terminology)
576. [AOP approaches ](#AOP-approaches)

## [lesson 119. AOP. Pointcut ](#lesson-119.-AOP.-Pointcut)

577. [spring-boot-starter-aop dependency ](#spring-boot-starter-aop-dependency)
578. [AspectJ annotations ](#AspectJ-annotations)
579. [@Pointcut ](#@Pointcut)
580. [@within ](#@within)
581. [within ](#within)
582. [this & target ](#this-&-target)
583. [@annotation ](#@annotation)
584. [args ](#args)
585. [@args ](#@args)
586. [bean ](#bean)
587. [execution ](#execution)

## [lesson 120. AOP. @Before Advice ](#lesson-120.-AOP.-@Before-Advice)
588. [@Before annotation ](#@Before-annotation)
589. [Тестирование функционала ](#Тестирование-функционала)
590. [CglibAopProxy ](#CglibAopProxy)
591. [Proxy interceptors ](#Proxy-interceptors)
592. [Spring AOP diagram ](#Spring-AOP-diagram)
593. [AopAutoConfiguration ](#AopAutoConfiguration)

## [lesson 121. AOP. JoinPoint. Params ](#lesson-121.-AOP.-JoinPoint.-Params)

594. [JoinPoint object ](#JoinPoint-object)
595. [Get access to proxy data from advice method params ](#Get-access-to-proxy-data-from-advice-method-params)
596. [Тестирование функционала ](#Тестирование-функционала)
597. [argNames ](#argNames)

## [lesson 122. AOP. @After Advices ](#lesson-122.-AOP.-@After-Advices)
598. [All types of advice ](#All-types-of-advice)
599. [@AfterReturning annotation ](#@AfterReturning-annotation)
600. [@AfterThrowing annotation ](#@AfterThrowing-annotation)
601. [@After annotation ](#@After-annotation)
602. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 123. AOP. @Around Advice ](#lesson-123.-AOP.-@Around-Advice)
603. [TransactionInterceptor ](#TransactionInterceptor)
604. [@Around annotation ](#@Around-annotation)
605. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 124. AOP. Best Practices ](#lesson-124.-AOP.-Best-Practices)
606. [1. Combine different Pointcut types ](#1.-Combine-different-Pointcut-types)
607. [2. Move common Pointcuts to separate Aspect ](#2.-Move-common-Pointcuts-to-separate-Aspect)
608. [3. Don t use @Around advice everywhere ](#3.-Don-t-use-@Around-advice-everywhere)
609. [4. Separate Pointcuts by business logic ](#4.-Separate-Pointcuts-by-business-logic)
610. [Aspects order ](#Aspects-order)


# [22. Заключение ](#22.-Заключение)

## [lesson 125. Custom Spring Boot Starter ](#lesson-125.-Custom-Spring-Boot-Starter)
611. [Create a new Gradle module ](#Create-a-new-Gradle-module)
612. [Define starter properties ](#Define-starter-properties)
613. [Create Autoconfiguration ](#Create-Autoconfiguration)
614. [File META-INF/spring.factories ](#File-META-INF/spring.factories)
615. [Move Aspects from the old to the new module ](#Move-Aspects-from-the-old-to-the-new-module)
616. [How to use newly created starter ](#How-to-use-newly-created-starter)
617. [spring-boot-configuration-processor ](#spring-boot-configuration-processor)
618. [Тестирование функционала ](#Тестирование-функционала)

## [lesson 126. Заключение. Путь развития ](#lesson-126.-Заключение.-Путь-развития)

619. [Spring Framework Documentation ](#Spring-Framework-Documentation)
620. [List of all main Spring Boot Starters ](#List-of-all-main-Spring-Boot-Starters)
621. [Java Road Map ](#Java-Road-Map)

========================================================================================
# `1. Intro`


## `lesson 1. Введение`


### 1.`Модули Spring (out of the box)`
Spring Framework - это платформа для разработки Java-приложений, которая предоставляет обширный набор инструментов и модулей для упрощения создания приложений. Вот некоторые из основных модулей Spring:

+ Spring Core Container - этот модуль предоставляет основные функции фреймворка, такие как управление бинами, внедрение зависимостей и управление жизненным циклом бинов.
+ Spring AOP (Aspect-Oriented Programming) - этот модуль позволяет создавать аспектно-ориентированные аспекты, такие как логирование, транзакции и безопасность.
+ Spring JDBC (Java Database Connectivity) - модуль, предоставляющий удобные средства для работы с базами данных и упрощающий кодирование доступа к данным.
+ Spring MVC (Model-View-Controller) - этот модуль предоставляет возможность создания веб-приложений с использованием шаблона проектирования MVC.
+ Spring Security - модуль для обеспечения безопасности приложений, включающий функции аутентификации, авторизации и защиты от атак.

### 2.`Удобство и простота использования`

### 3.`Микросервисная архитектура`
Микросервисная архитектура - это подход к построению приложения в виде набора независимо развертываемых сервисов Вместо того, чтобы создавать монолитное приложение, микросервисная архитектура разделяет его на отдельные компоненты, называемые микросервисами. Каждый микросервис выполняет определенную функцию и может быть разработан, развернут и масштабирован независимо от других сервисов.

Преимущества микросервисной архитектуры
Микросервисная архитектура имеет несколько преимуществ, включая:

1. Гибкость и масштабируемость: Микросервисы могут быть разработаны и развернуты независимо друг от друга, что позволяет гибко масштабировать и изменять отдельные компоненты приложения.

2. Легкость в разработке и поддержке: Разделение приложения на микросервисы упрощает разработку и поддержку, поскольку каждый сервис может быть разработан и поддерживаться отдельной командой.

3. Улучшенная отказоустойчивость: Если один микросервис выходит из строя, остальные микросервисы продолжают работать нормально, что повышает отказоустойчивость системы.

4. Технологическая свобода: Каждый микросервис может использовать разные технологии и языки программирования, что позволяет выбрать наиболее подходящие инструменты для каждой конкретной задачи.

Примеры использования микросервисной архитектуры
Микросервисная архитектура широко применяется в различных областях, включая:

1. Веб-приложения: Микросервисная архитектура позволяет разделить функциональность веб-приложения на отдельные сервисы, такие как аутентификация, обработка платежей и управление контентом.

2. Интернет вещей (IoT): Микросервисная архитектура может быть использована для разработки и управления сложными системами IoT, где различные устройства и сервисы взаимодействуют между собой.

3. Облачные вычисления: Облачные провайдеры, такие как Amazon Web Services (AWS), используют микросервисную архитектуру для предоставления различных сервисов, таких как хранение данных, обработка изображений и машинное обучение.

4. API-сервисы: Микросервисная архитектура может быть использована для создания API-сервисов, которые предоставляют доступ к функциональности приложения через стандартные интерфейсы, такие как REST API.

Заключение
Микросервисная архитектура - это подход к построению приложений, который разделяет их на независимо развертываемые сервисы. Она обладает преимуществами гибкости, масштабируемости, легкости в разработке и поддержке, а также улучшенной отказоустойчивости. Микросервисная архитектура широко применяется в различных областях, включая веб-приложения, IoT, облачные вычисления и API-сервисы.


### 4.`Support & Community`

### 5.`Что нужно знать для изучения курса Spring`


## `lesson 2. Установка программного обеспечения`



### 6.`Установка Java 17`

Для установки Java 17 на Mac и Windows, вам потребуется выполнить следующие шаги:

+ Для Windows:

Скачайте установщик JDK с сайта AdoptOpenJDK.
Выберите соответствующую версию в зависимости от разрядности вашей операционной системы: Windows 32bit или Windows 64bit.
Установите JDK, следуя инструкциям установщика.

+ Для Mac:

Перейдите на сайт adoptium.net.
Скачайте установщик для Mac.
Установите JDK, следуя инструкциям установщика.
Примечание: После установки JDK, убедитесь, что переменная окружения JAVA_HOME указывает на установленный JDK.

### 7.`Установка IntelliJ IDEA Ultimate Edition`

### 8.`Установка PostgreSQL`

Для установки PostgreSQL на Windows, вы можете использовать следующие шаги:

+ Эти шаги должны помочь вам установить PostgreSQL на Windows.

Скачайте установочный файл PostgreSQL с официального сайта по ссылке: https://www.postgresql.org/download/windows/ . Запустите установочный файл и следуйте инструкциям мастера установки, нажимая "Next" для перехода к следующему шагу.

Выберите необходимые компоненты для установки, такие как клиентские утилиты, сервер и дополнительные инструменты.

Укажите порт для сервера PostgreSQL (по умолчанию 5432) и настройте другие параметры, если необходимо.

Создайте пароль для пользователя "postgres" и завершите установку, нажав "Next" и затем "Finish".

После установки, вы можете запустить PostgreSQL, используя командную строку или другие утилиты.




+ Установка PostgreSQL на Mac
Для установки PostgreSQL на Mac, вы можете воспользоваться следующими шагами:

Используйте Homebrew для установки PostgreSQL на Mac OS. Вы можете выполнить следующие команды в терминале:
```
brew install postgresql
```

После установки, вы можете запустить PostgreSQL, используя командную строку или другие утилиты.

Для управления PostgreSQL на Mac, вы можете использовать различные инструменты, такие как PgAdmin или другие графические интерфейсы.

Эти шаги помогут вам установить PostgreSQL на Mac OS.

### 9.`Установка Docker`

Для установки Docker на Windows и Mac, вам потребуется скачать и установить Docker Desktop. Вот краткое руководство по установке:

+ Windows:

Скачайте и установите Docker Desktop для Windows с официального сайта Docker.
Убедитесь, что ваша операционная система соответствует системным требованиям Docker Desktop.
После установки запустите Docker Desktop и следуйте инструкциям по настройке.

+ Mac:

Скачайте и установите Docker Desktop для Mac с официального сайта Docker.
Убедитесь, что ваша операционная система соответствует системным требованиям Docker Desktop.
После установки запустите Docker Desktop и следуйте инструкциям по настройке.

### 10.`Создание нового проекта`

Для создания нового проекта Spring вы можете использовать Spring Initializr, который позволяет быстро и легко настроить и сгенерировать проект Spring. Вот как вы можете это сделать:

+ Используйте Spring Initializr: Вы можете использовать Spring Initializr, доступный по адресу https://start.spring.io/, чтобы создать новый проект Spring. Выберите необходимые зависимости и настройки проекта, а затем сгенерируйте проект.
+ Выберите необходимые зависимости: При создании проекта Spring вы можете выбрать необходимые зависимости, такие как Spring Boot, JDK, Maven и другие, в зависимости от ваших потребностей.
+ Структура проекта: После создания проекта вы увидите стандартную структуру проекта, которая включает каталоги src/main/java для исходного кода и pom.xml для управления зависимостями с помощью Maven.
+ Дополнительные настройки: В зависимости от ваших потребностей, вы также можете добавить дополнительные настройки, такие как настройку базы данных, настройку безопасности, создание контроллеров и служб и другие.


## `lesson 3. Inversion of Control. Dependency Injection`

### 11.`Object Dependencies`
Object Dependencies (зависимости объектов) относятся к концепции Dependency Injection (DI), которая используется в разработке программного обеспечения. DI представляет собой способ управления зависимостями между объектами в приложении. В контексте программирования DI позволяет внедрять зависимости в объекты, что обеспечивает более гибкую и управляемую архитектуру приложения.

Источник указывает, что DI является частью концепции Inversion of Control (IoC), которая изменяет способ, которым объекты получают свои зависимости. Вместо того, чтобы объект самостоятельно создавать свои зависимости, они внедряются в объект извне.

Источник уточняет, что Dependency Injection (DI) может использоваться для управления зависимостями в различных технологиях, таких как Spring Framework в Java.

Таким образом, Object Dependencies (зависимости объектов) в контексте программирования относятся к способу управления зависимостями между объектами в приложении с использованием концепции Dependency Injection (DI).


### 12.`Object Dependencies в коде`

### 13.`Inversion of Control & Dependency Injection`

### 14.`Inversion of Control & Dependency Injection в коде`

### 15.`3 способа внедрения зависимостей в объекте`

## `lesson 4. IoC Container`


### 16.`Spring IoC Container`

Spring IoC Container - это часть Spring Framework, которая реализует принцип инверсии управления (Inversion of Control, IoC). Он отвечает за создание объектов, их связывание и управление их жизненным циклом. IoC Container позволяет создавать и управлять зависимостями между объектами, что упрощает разработку приложений и делает их более гибкими и легкими для тестирования.

Пример использования Spring IoC Container:

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
Этот код инициализирует контейнер приложения Spring и загружает конфигурацию из файла "services.xml".

Spring IoC Container также известен как Spring Container и предоставляет механизм для управления объектами приложения и их зависимостями.

Итак, Spring IoC Container играет важную роль в управлении объектами и их зависимостями в приложениях, обеспечивая гибкость и удобство в разработке.

### 17.`Bean`

Bean - это ключевое понятие в Spring Framework. Это объекты, которые являются основой вашего приложения и управляются контейнером управления инверсией управления (IoC) Spring. Bean - это объект, который создается, собирается и управляется контейнером управления инверсией управления Spring IoC. Он может быть описан с помощью аннотаций, таких как @Bean, @Component и других, или с использованием XML-конфигурации. Bean также может иметь различные характеристики, такие как класс, имя, область видимости и другие.

Дополнительно, bean в Spring Framework также связан с понятием Dependency Injection (DI). Он играет важную роль в создании гибкой и модульной архитектуры приложения, позволяя внедрять зависимости между компонентами приложения.

Итак, bean в Spring Framework представляет собой объект, управляемый контейнером управления инверсией управления Spring IoC, который обеспечивает гибкую и модульную архитектуру приложения.

### 18.`Bean Definition`

Bean - ключевой концепт Spring Framework. Понимание этого понятия критично для освоения фреймворка и его эффективного использования. В Spring объекты, которые составляют основу вашего приложения и управляются контейнером управления инверсией управления (IoC) Spring, называются beans. Bean - это объект, который создается, собирается и управляется контейнером управления инверсией управления Spring IoC.


Пример использования bean в Spring можно увидеть в следующем коде:
```java
@Configuration
public class LessonsConfiguration {
    @Bean
    public BeanWithDependency beanWithDependency() {
        return new BeanWithDependency(greetingService());
    }

    @Bean
    public GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}
```

### 19.`POJO`

POJO в контексте Spring означает "Plain Old Java Object" (Простой Старый Java-Объект). Это обычный Java-объект, который не зависит от каких-либо специфических библиотек или фреймворков. В Spring фреймворке, POJO используются для создания компонентов, которые могут быть управляемыми контейнером Spring.

Spring - это фреймворк для разработки приложений на языке Java. Он предоставляет множество готовых решений для упрощения разработки, таких как управление зависимостями, внедрение зависимостей, управление транзакциями и многое другое.

Пример простого POJO класса в Spring может выглядеть следующим образом:
```java
public class User {
    private String name;
    private int age;

    // геттеры и сеттеры
}
```

В этом примере, класс User является простым Java-объектом без зависимостей от каких-либо специфических библиотек или фреймворков, что соответствует определению POJO.

Заключение
POJO в Spring представляет собой обычные Java-объекты, которые используются для создания компонентов в приложениях, не зависящих от специфических библиотек или фреймворков. Spring фреймворк облегчает использование POJO для создания управляемых компонентов в приложениях на языке Java.

### 20.`Основные интерфейсы IoC Container`

IoC Container (Inversion of Control Container) предоставляет различные интерфейсы для управления зависимостями и контроля жизненного цикла объектов.

Из поисковых результатов видно, что основные интерфейсы IoC Container включают:

+ ApplicationContext в Spring Framework, который предоставляет механизм для управления конфигурацией приложения, создания бинов и управления их жизненным циклом.
+ XML-конфигурации в Spring Framework, которая позволяет определять бины и их зависимости в XML-файлах.
+ BeanFactory в Spring Framework, предоставляющая расширенную модель конфигурации и управления бинами.
+ Container interface в PHP, такой как в Laravel, который предоставляет методы для регистрации и разрешения зависимостей.
+ Inversion of Control (IoC), который предоставляет механизм для управления созданием и жизненным циклом объектов.


Эти интерфейсы играют важную роль в управлении зависимостями и жизненным циклом объектов в различных фреймворках и языках программирования.


### 21.`3 способа создания Bean Definitions`

В Spring Framework существует несколько способов создания определений бинов. Некоторые из них включают:

1. Аннотации (@Component, @Service, @Repository, @Controller): В Spring Framework можно использовать аннотации, такие как @Component, @Service, @Repository, @Controller для создания определений бинов. Например:
import org.springframework.stereotype.Component;
```java
@Component
public class SimpleBean {
    public String hello() {
        return "Hello world!";
    }
}
```

2. XML-конфигурация: Другим способом создания определений бинов в Spring Framework является использование XML-конфигурации. Это позволяет определять бины в XML-файлах. Например:

```xml
<bean id="simpleBean" class="com.example.SimpleBean">
    <property name="message" value="Hello world!" />
</bean>
```

3. Java-конфигурация: Также возможно создавать определения бинов в Spring Framework с помощью Java-конфигурации, что позволяет определять бины в коде на Java.
```java
@Configuration
public class AppConfig {
    @Bean
    public SimpleBean simpleBean() {
        return new SimpleBean();
    }
}
```


Эти способы предоставляют различные подходы к созданию определений бинов в Spring Framework, и выбор конкретного способа может зависеть от конкретных потребностей проекта.

# 2. XML-based Configuration

## lesson 5. XML-based Configuration


### 22.`BeanFactory и ApplicationContext интерфейсы`

BeanFactory и ApplicationContext - это интерфейсы в Spring Framework, используемые для управления, конфигурирования и манипулирования бинами.

BeanFactory предоставляет основные функции для управления и манипулирования бинами в программном виде, в то время как ApplicationContext предоставляет дополнительные функции, такие как доступ к ресурсам, распространение событий на бины, загрузку нескольких (иерархических) контекстов и другие возможности в более ориентированном на фреймворк стиле.

ApplicationContext расширяет функциональность BeanFactory и предоставляет дополнительные возможности, такие как доступ к ресурсам, распространение событий на бины, загрузку нескольких (иерархических) контекстов и другие возможности в более ориентированном на фреймворк стиле.

Важно отметить, что ApplicationContext предоставляет дополнительные функции, такие как MessageSource, доступ к ресурсам, распространение событий на бины, загрузку нескольких (иерархических) контекстов и другие возможности в более ориентированном на фреймворк стиле.

Различия между BeanFactory и ApplicationContext:

+ Интерфейсы IOC (Inversion of Control):

BeanFactory является основным интерфейсом для доступа к контейнеру Spring, обеспечивающим управление бинами и их зависимостями через механизм IOC.
ApplicationContext расширяет функциональность BeanFactory и предоставляет дополнительные возможности, такие как обработка событий, межбиновые ссылки, доступ к ресурсам и многое другое.

+ Производительность и гибкость:

ApplicationContext обычно предпочтительнее для большинства приложений из-за своей более высокой производительности и гибкости.
BeanFactory может быть полезен в случаях, когда требуется минимальная конфигурация и ленивая инициализация бинов.

+ Поддержка аннотаций:

ApplicationContext обеспечивает поддержку аннотаций для внедрения зависимостей и управления бинами, что делает его более удобным в использовании в современных приложениях.

+ Обработка событий:

ApplicationContext предоставляет возможность обработки событий, что позволяет реагировать на различные события в контейнере Spring.


+ Межбиновые ссылки и доступ к ресурсам:

ApplicationContext позволяет легко устанавливать межбиновые ссылки и получать доступ к различным ресурсам, таким как файлы, URL-адреса и т. д..


В заключение, хотя BeanFactory и ApplicationContext оба предоставляют возможности управления бинами в Spring Framework, ApplicationContext предоставляет более широкий спектр функциональности и обычно является предпочтительным выбором для большинства приложений.

### 23.`ClassPathXmlApplicationContext`

ClassPathXmlApplicationContext - это класс в Spring Framework, который позволяет загружать конфигурацию бинов из XML-файлов, находящихся в classpath, и автоматически обновлять контекст.

Пример использования ClassPathXmlApplicationContext:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getId() + ":" + person.getName());
ClassPathXmlApplicationContext также позволяет использовать несколько XML-файлов конфигурации для инициализации контейнера Spring. В этом случае бины, определенные в последних загруженных файлах, переопределят бины, определенные в ранее загруженных файлах.

Конструкторы ClassPathXmlApplicationContext
ClassPathXmlApplicationContext имеет несколько конструкторов для загрузки определений бинов из XML-файлов и автоматического обновления контекста. Некоторые из них включают:

+ ClassPathXmlApplicationContext(String configLocation)
+ ClassPathXmlApplicationContext(String... configLocations)
+ ClassPathXmlApplicationContext(String[] configLocations, boolean refresh)


Этот класс также полезен для тестовых сред и демонстрационных целей.

Префикс classpath:* При конструировании контекста приложения, иногда можно использовать префикс classpath*:.

Этот класс также полезен для тестовых сред и демонстрационных целей.

Заключение
ClassPathXmlApplicationContext в Spring Framework предоставляет удобный способ загрузки конфигурации бинов из XML-файлов, находящихся в classpath, и автоматического обновления контекста. Он также поддерживает использование нескольких XML-файлов конфигурации и предоставляет различные конструкторы для удобства использования.

### 24.`XML config`

XML-конфигурация Spring Framework используется для настройки бинов, внедрения зависимостей и других аспектов приложения. В XML-файле можно определить бины, их зависимости, свойства и другие настройки. Пример XML-конфигурации может выглядеть следующим образом:
```xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="exampleBean" class="com.example.ExampleBean">
        <property name="property1" value="someValue"/>
        <property name="property2" ref="anotherBean"/>
    </bean>

    <bean id="anotherBean" class="com.example.AnotherBean">
        <!-- настройки для другого бина -->
    </bean>

</beans>
```
Здесь <beans> - корневой элемент, в котором определяются все бины приложения. <bean> используется для определения бина, его id, класса и свойств. Внутри <property> можно указать значение свойства или ссылку на другой бин.

Основные элементы XML-конфигурации Spring включают в себя:

<beans>: Этот элемент является корневым элементом XML-конфигурации Spring. Он содержит определения бинов и другие конфигурационные элементы.
<bean>: Этот элемент определяет отдельный бин в контейнере Spring. Он содержит информацию о классе бина, его зависимостях и других настройках.
<property>: Этот элемент используется для внедрения значений свойств в бины. Например, это может быть ссылка на другой бин или просто значение.
<constructor-arg>: Этот элемент определяет аргументы конструктора для инъекции зависимостей.

XML-конфигурация Spring предоставляет гибкость и читаемость, но в современных приложениях часто используется аннотационный подход для конфигурации Spring.


### 25.`Идентификаторы (id) бинов как ключи в IoC Container`

В контейнере управления инверсией управления (IoC) идентификаторы (id) бинов используются в качестве ключей для доступа к объектам, зарегистрированным в контейнере. Вот некоторые ключевые моменты:

Spring IoC Container и типы бинов:

+ В Spring IoC Container существуют различные типы бинов, такие как singleton, prototype, request и session.
+ Бины типа singleton создаются один раз и используются повсюду в приложении, в то время как бины типа prototype создаются каждый раз при запросе.
+ Бины типа request и session связаны с HTTP-запросами и сеансами соответственно.


Регистрация бинов в IoC Container:

+ Бины регистрируются в контейнере с помощью аннотаций, таких как @Bean и @Component.
+ Аннотация @Bean используется для указания методов, которые возвращают объекты, которые должны быть зарегистрированы в контейнере.
+ Аннотация @Component используется для автоматической регистрации классов в контейнере.


Использование идентификаторов (id) бинов:

+ Идентификаторы (id) бинов используются в качестве ключей для доступа к зарегистрированным объектам в контейнере.
+ Эти идентификаторы могут быть использованы для получения бинов из контейнера с помощью метода getBean().
+ Инверсия управления (IoC) и внедрение зависимостей (DI):

IoC и DI являются ключевыми концепциями в управлении зависимостями в приложениях.
В IoC контейнере объекты не создаются вручную, а управление их жизненным циклом осуществляется контейнером.
DI позволяет внедрять зависимости в объекты, что упрощает управление зависимостями и повышает гибкость приложения.
Таким образом, идентификаторы (id) бинов играют важную роль в IoC Container, обеспечивая уникальный доступ к зарегистрированным объектам и управляя их жизненным циклом.

### 26.`Алиасы бинов (alias)`

В Spring Framework алиасы бинов используются для предоставления альтернативных имен для бинов. Например, если у вас есть бин с именем "myBean", вы можете создать алиас "myAlias" для этого бина. Это может быть полезно для улучшения читаемости кода или обеспечения совместимости с другими системами.

Примеры использования алиасов в Spring:

+ В XML-конфигурации Spring:
```xml
<bean id="myBean" class="com.example.MyClass" />
<alias name="myAlias" alias="myBean" />
```

В этом примере "myAlias" является алиасом для бина "myBean".


+ В Java-конфигурации Spring:
```java
@Component("myBean")
public class MyClass {
    // Код класса
}
```

В этом случае "myBean" может быть использован как основное имя бина, а затем созданы алиасы для него.

Эти примеры демонстрируют, как можно использовать алиасы для бинов в Spring Framework


# Start of Selection
## `lesson 6. Внедрение через конструктор (Constructor Injection)`

Внедрение через конструктор — это один из способов внедрения зависимостей в Spring Framework. Этот подход позволяет передавать зависимости в объект через его конструктор, что обеспечивает неизменяемость и явность зависимостей. Внедрение через конструктор особенно полезно, когда требуется обязательное наличие зависимостей для корректной работы объекта.

### Пример использования внедрения через конструктор

Рассмотрим пример, в котором у нас есть класс `DatabaseService`, который зависит от `DatabaseConfig`. Мы будем использовать внедрение через конструктор для передачи конфигурации базы данных в сервис.

```java
public class DatabaseService {
    private DatabaseConfig config;

    public DatabaseService(DatabaseConfig config) {
        this.config = config;
    }
}
```

В этом примере класс `DatabaseService` имеет конструктор, который принимает параметр типа `DatabaseConfig`. Spring будет автоматически внедрять экземпляр `DatabaseConfig` в сервис при создании бина.


### 27.`Внедрение примитивных типов данных`

В Spring Framework внедрение примитивных типов данных может осуществляться с помощью различных механизмов, таких как аннотации @Value и @Autowired. Давайте рассмотрим примеры внедрения примитивных типов данных в Spring.

1. Внедрение примитивных типов данных с помощью аннотации @Value: Пример внедрения значения примитивного типа данных с использованием аннотации @Value:
```java
import org.springframework.beans.factory.annotation.Value;

public class MyBean {
    @Value("10")
    private int myNumber;
    // Другие поля и методы класса
}
```

Этот пример демонстрирует внедрение значения примитивного типа данных (в данном случае, целочисленного) с использованием аннотации @Value.

2. Внедрение примитивных типов данных с помощью @Autowired: Внедрение примитивных типов данных с использованием @Autowired может осуществляться через конструктор, сеттеры или поля. Например:

+ Внедрение через конструктор:
```java
public class MyBean {
    private int myNumber;

    @Autowired
    public MyBean(@Value("10") int myNumber) {
        this.myNumber = myNumber;
    }
    // Другие поля и методы класса
}
```

Этот пример демонстрирует внедрение значения примитивного типа данных через конструктор с использованием аннотации @Autowired и @Value.

+ Внедрение через сеттеры или поля:
```java
public class MyBean {
    @Value("10")
    private int myNumber;
    // Другие поля и методы класса
}
```

В этом примере значение примитивного типа данных внедряется непосредственно в поле класса с использованием аннотации @Value.

Таким образом, в Spring Framework существует несколько способов внедрения примитивных типов данных, таких как целые числа, строки и булевы значения, с использованием различных аннотаций и механизмов внедрения зависимостей.

### 28.`Внедрение коллекций list/set`

Spring Framework предоставляет возможность использовать внедрение коллекций (list/set) с помощью конструктора. Это позволяет передавать коллекции объектов в качестве зависимостей. Вот примеры:

+ Пример внедрения списка (List) с использованием конструктора:
```java
public class CollectionExample {
    private List<String> myList;

    public CollectionExample(List<String> myList) {
        this.myList = myList;
    }
}
```

+ Пример внедрения множества (Set) с использованием конструктора:
```java
public class CollectionExample {
    private Set<Integer> mySet;

    public CollectionExample(Set<Integer> mySet) {
        this.mySet = mySet;
    }
}
```
В обоих примерах Spring будет автоматически внедрять соответствующие коллекции при создании экземпляра класса CollectionExample.


### 29.`Внедрение ассоциативного массива map`

Spring предоставляет возможность использовать ассоциативные массивы, такие как Map, для хранения пар ключ-значение. Вот пример внедрения ассоциативного массива Map в Spring:
```java
import java.util.Map;

public class MyBean {
    private Map<String, String> myMap;

    // Геттер и сеттер для myMap
    public Map<String, String> getMyMap() {
        return myMap;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }
}
```
В этом примере класс MyBean содержит поле myMap, которое представляет ассоциативный массив Map с ключами и значениями типа String. Этот Map может быть внедрен в другие компоненты Spring, такие как сервисы или контроллеры, для удобного доступа к данным.

Использование Map в Spring позволяет эффективно управлять парами ключ-значение и обеспечивает гибкость при работе с данными в приложении.

### 30.`Поле genericArgumentValues в BeanDefinition`

Поле `genericArgumentValues` в `BeanDefinition` используется для хранения значений аргументов конструктора, которые имеют обобщенные типы. Это позволяет Spring более гибко управлять зависимостями, особенно когда необходимо передавать параметры с использованием обобщений.

Пример использования `genericArgumentValues` может выглядеть следующим образом:
```java
public class MyBean {
    private List<String> myList;

    public MyBean(List<String> myList) {
        this.myList = myList;
    }
}
```

В этом примере класс `MyBean` имеет конструктор, который принимает параметр типа `List<String>`. Spring будет использовать `genericArgumentValues` для хранения этого параметра.


### 31.`Поле indexedArgumentValues в BeanDefinition`

Поле `indexedArgumentValues` в `BeanDefinition` используется для хранения значений аргументов конструктора, которые имеют индексированные типы. Это позволяет Spring более гибко управлять зависимостями, особенно когда необходимо передавать параметры с использованием индексированных типов.

Пример использования `indexedArgumentValues` может выглядеть следующим образом:
```java
public class MyBean {
    private String[] myArray;

    public MyBean(String[] myArray) {
        this.myArray = myArray;
    }
}
```

### 32.`Указание атрибута type в параметрах конструктора`

В Spring Framework, когда вы создаете бины, иногда необходимо указать тип параметра конструктора. Это особенно важно, когда у вас есть несколько бинов одного типа, и Spring должен знать, какой именно бин использовать.

Например, предположим, у вас есть два бина, которые оба являются списками строк:

```java
public class MyBean {
    private List<String> myList;

    public MyBean(List<String> myList) {
        this.myList = myList;
    }
}
```

В этом примере Spring будет использовать тип `List<String>` для определения, какой именно бин использовать.     


### 33.`Указание атрибута name в параметрах конструктора`

В Spring Framework, когда вы создаете бины, иногда необходимо указать тип параметра конструктора. Это особенно важно, когда у вас есть несколько бинов одного типа, и Spring должен знать, какой именно бин использовать.

Например, предположим, у вас есть два бина, которые оба являются списками строк:    

```java
public class MyBean {
    private List<String> myList;

    public MyBean(List<String> myList) {
        this.myList = myList;
    }
}   
```

В этом примере Spring будет использовать тип `List<String>` для определения, какой именно бин использовать.     



## `lesson 7. Factory Method Injection`


# Start of Selection
### 34.`Внедрение других бинов через ref*`

В Spring Framework внедрение других бинов через атрибут `ref` позволяет ссылаться на уже существующие бины в контексте приложения. Это особенно полезно, когда необходимо использовать один бин в другом, обеспечивая тем самым повторное использование и управление зависимостями.

Пример использования `ref` в XML-конфигурации может выглядеть следующим образом:
```xml
<bean id="myBean" class="com.example.MyBean">
    <property name="otherBean" ref="anotherBean"/>
</bean>
```

В этом примере `myBean` использует `anotherBean` в качестве зависимости.



### 35.`Создание нового бина CompanyRepository`

Для создания нового бина `CompanyRepository` в Spring Framework, необходимо определить класс репозитория, который будет отвечать за доступ к данным, связанным с сущностью `Company`. Обычно это делается с использованием интерфейса, который расширяет `JpaRepository` или `CrudRepository`, если вы используете Spring Data JPA.

Пример реализации может выглядеть следующим образом:
```java
public interface CompanyRepository extends JpaRepository<Company, Long> {
    // Методы для доступа к данным
}
```

В этом примере `CompanyRepository` расширяет `JpaRepository`, что позволяет использовать стандартные методы для доступа к данным, такие как `save`, `findById`, `findAll` и т.д.

### 36.`Внедрение зависимостей через factory method`

Внедрение зависимостей через фабричный метод (factory method) в Spring Framework позволяет создавать бины с использованием методов, которые возвращают экземпляры этих бинов. Это особенно полезно, когда необходимо выполнить некоторую логику перед созданием объекта или когда создание объекта требует сложных параметров.

Фабричный метод может быть определен в классе, который будет выступать в роли фабрики. Например, предположим, что у нас есть класс `Car`, и мы хотим создать его экземпляр с помощью фабричного метода.

Пример реализации может выглядеть следующим образом:
```java
public class CarFactory {
    public static Car createCar() {
        // Логика для создания объекта Car
        return new Car();
    }
}
```

В этом примере класс `CarFactory` содержит статический метод `createCar`, который возвращает новый экземпляр класса `Car`.


### 37.`Атрибут factory-bean (паттерн ServiceLocator)`

Атрибут `factory-bean` в Spring Framework используется для указания бина, который будет выступать в качестве фабрики для создания других бинов. Это позволяет использовать паттерн Service Locator, который помогает управлять зависимостями и упрощает создание объектов.

Когда вы используете `factory-bean`, вы можете определить метод в указанном бине, который будет возвращать экземпляр другого бина. Это особенно полезно, когда создание бина требует сложной логики или параметров.

Пример использования `factory-bean` в XML-конфигурации может выглядеть следующим образом:
```xml
<bean id="myBean" factory-bean="myFactoryBean" factory-method="createCar"/>
```

В этом примере `myBean` будет создан с помощью метода `createCar` из бина `myFactoryBean`.



## `lesson 8. Внедрение свойств (Property Injection)`

Внедрение свойств (Property Injection) — это один из способов внедрения зависимостей в Spring Framework, который позволяет устанавливать значения свойств бина через методы `set*`. Этот подход особенно полезен, когда необходимо настроить бин после его создания, а также когда значения свойств могут изменяться в процессе работы приложения.

### Пример использования внедрения свойств

Рассмотрим пример, в котором мы создаем класс `DatabaseConfig`, который будет содержать настройки для подключения к базе данных. Мы будем использовать методы `set*` для внедрения значений свойств.

```java
public class DatabaseConfig {
    private String url;
    private String username;
    private String password;
}
```


### 38.`Использование set* методов в ConnectionPool`

Использование методов `set*` в классе `ConnectionPool` является распространенной практикой для внедрения зависимостей и настройки параметров пула соединений. Пул соединений — это механизм, который управляет набором соединений с базой данных, позволяя многим клиентам использовать одно и то же соединение, что значительно повышает производительность приложения.

Пример реализации класса `ConnectionPool` с использованием методов `set*` может выглядеть следующим образом:
```java
public class ConnectionPool {
    private String url;
    private String username;
    private String password;

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
```

В этом примере класс `ConnectionPool` имеет методы `setUrl`, `setUsername` и `setPassword`, которые используются для настройки параметров пула соединений.



### 39.`Поле propertyValues в BeanDefinition`

Поле `propertyValues` в `BeanDefinition` используется для хранения значений свойств, которые должны быть установлены в бине при его создании. Это позволяет Spring управлять зависимостями и конфигурацией бинов, обеспечивая гибкость и модульность в приложении.

Когда вы определяете бин в конфигурации, вы можете указать значения его свойств с помощью `propertyValues`. Например, если у вас есть класс `DataSource`, который требует настройки URL, имени пользователя и пароля, вы можете определить его в XML-конфигурации следующим образом:
```xml
<bean id="dataSource" class="com.example.DataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="user"/>
    <property name="password" value="password"/>
</bean>
```


В этом примере `dataSource` будет создан с настроенными значениями свойств `url`, `username` и `password`.



### 40.`Упрощенный жизненный цикл бинов - Bean Lifecycle`

В Spring Framework жизненный цикл бинов включает несколько этапов, которые управляют созданием, настройкой и уничтожением объектов. Понимание этого жизненного цикла важно для эффективного использования Spring и управления ресурсами.

1. **Создание бина**: Когда Spring контейнер инициализируется, он создает экземпляры бинов, определенных в конфигурации. Это может происходить при запуске приложения или по запросу.

   Пример:
   ```java
   @Component
   public class MyBean {
       public MyBean() {
           System.out.println("Бин MyBean создан");
       }
   }
   ```

2. **Настройка бина**: После создания бина Spring настраивает его свойства, используя значения, указанные в конфигурации. Это может включать внедрение зависимостей через конструкторы, сеттеры или аннотации.

   Пример:
   ```java
   @Component
   public class MyService {
       private final MyRepository repository;

       @Autowired
       public MyService(MyRepository repository) {
           this.repository = repository;
       }
   }
   ```

3. **Инициализация бина**: После настройки бина Spring может вызывать методы инициализации, если они определены. Это позволяет выполнять дополнительные действия, такие как открытие соединений или настройка ресурсов.

   Пример:
   ```java
   @Component
   public class MyBean {
       @PostConstruct
       public void init() {
           System.out.println("Бин MyBean инициализирован");
       }
   }
   ```

4. **Использование бина**: После инициализации бин готов к использованию. Он может быть запрошен другими компонентами или сервисами в приложении.

5. **Уничтожение бина**: Когда приложение завершает свою работу или бин больше не нужен, Spring вызывает методы уничтожения, чтобы освободить ресурсы. Это особенно важно для бинов, которые используют внешние ресурсы, такие как соединения с базой данных.

   Пример:
   ```java
   @Component
   public class MyBean {
       @PreDestroy
       public void cleanup() {
           System.out.println("Бин MyBean уничтожен");
       }
   }
   ```

Таким образом, жизненный цикл бинов в Spring включает создание, настройку, инициализацию, использование и уничтожение, что позволяет эффективно управлять ресурсами и зависимостями в приложении.


### 41.`Плюсы и минусы Constructor и Property Injections`

В Spring Framework существует два основных способа внедрения зависимостей: через конструктор (Constructor Injection) и через свойства (Property Injection). У каждого из этих подходов есть свои плюсы и минусы, которые стоит рассмотреть.

#### Плюсы Constructor Injection:

1. **Неизменяемость**: При использовании внедрения через конструктор зависимости передаются в объект при его создании, что делает объект неизменяемым после создания. Это особенно полезно для обеспечения целостности данных.

   Пример:
   ```java
   @Component
   public class MyService {
       private final MyRepository repository;

       @Autowired
       public MyService(MyRepository repository) {
           this.repository = repository;
       }
   }
   ```

2. **Явность зависимостей**: Все зависимости класса явно указаны в его конструкторе, что упрощает понимание того, какие зависимости необходимы для работы класса.

3. **Поддержка обязательных зависимостей**: Если зависимость является обязательной, то ее можно сделать обязательным параметром конструктора, что предотвращает создание объекта без необходимых зависимостей.

#### Минусы Constructor Injection:

1. **Сложность при большом количестве зависимостей**: Если у класса много зависимостей, конструктор может стать громоздким и трудным для чтения.

   Пример:
   ```java
   @Component
   public class ComplexService {
       private final DependencyA a;
       private final DependencyB b;
       private final DependencyC c;

       @Autowired
       public ComplexService(DependencyA a, DependencyB b, DependencyC c) {
           this.a = a;
           this.b = b;
           this.c = c;
       }
   }
   ```

#### Плюсы Property Injection:

1. **Гибкость**: Внедрение через свойства позволяет изменять зависимости после создания объекта, что может быть полезно в некоторых сценариях.

   Пример:
   ```java
   @Component
   public class MyService {
       private MyRepository repository;

       @Autowired
       public void setRepository(MyRepository repository) {
           this.repository = repository;
       }
   }
   ```

2. **Упрощение конструктора**: Если у класса много зависимостей, можно использовать сеттеры для их внедрения, что делает конструктор более простым и понятным.

#### Минусы Property Injection:

1. **Изменяемость**: Объекты могут быть изменены после создания, что может привести к непредсказуемому поведению, если зависимости изменяются в процессе работы.

2. **Неявность зависимостей**: Зависимости не видны в конструкторе, что может затруднить понимание того, какие зависимости необходимы для работы класса.

Таким образом, выбор между Constructor и Property Injection зависит от конкретных требований вашего приложения и предпочтений команды. Важно учитывать как плюсы, так и минусы каждого подхода при проектировании архитектуры приложения.

# Start of Selection
### 42.`Циклические зависимости через Property Injection`

Циклические зависимости возникают, когда два или более бина зависят друг от друга. Это может привести к проблемам при создании бинов, так как Spring не сможет корректно разрешить зависимости. Однако, с помощью внедрения через свойства (Property Injection) можно обойти эту проблему.

Рассмотрим пример, где у нас есть два бина: `BeanA` и `BeanB`. `BeanA` зависит от `BeanB`, а `BeanB` зависит от `BeanA`.

```java
public class BeanA {
    private BeanB beanB;
}
```








## `lesson 9. Области видимости бинов (Bean Scopes)`

В Spring Framework существует несколько областей видимости (scope) для бинов, которые определяют, как и когда создаются экземпляры бинов. Понимание областей видимости бинов является важным аспектом проектирования приложений на Spring, так как это влияет на управление состоянием и жизненным циклом объектов. Основные области видимости включают:

+ **Singleton**: Это область видимости по умолчанию. В этом случае Spring создает только один экземпляр бина для всего приложения. Этот экземпляр будет использоваться при каждом запросе к этому бину. Например:

   ```java
   @Component
   public class MySingletonBean {
       public MySingletonBean() {
           System.out.println("Создан экземпляр MySingletonBean");
       }
   }
   ```

   При каждом запросе к `MySingletonBean` будет возвращаться один и тот же экземпляр. Это полезно для бинов, которые должны сохранять состояние или кэшировать данные.

+ **Prototype**: При этой области видимости Spring создает новый экземпляр бина каждый раз, когда он запрашивается. Это полезно, когда необходимо иметь уникальный экземпляр бина для каждого запроса. Например:

   ```java
   @Component
   @Scope("prototype")
   public class MyPrototypeBean {
       public MyPrototypeBean() {
           System.out.println("Создан экземпляр MyPrototypeBean");
       }
   }
   ```

   Каждый раз, когда вы запрашиваете `MyPrototypeBean`, будет создаваться новый экземпляр. Это может быть полезно для бинов, которые содержат временные данные или состояние, специфичное для конкретного запроса.

+ **Request**: Эта область видимости используется в веб-приложениях. Бин с областью видимости `request` создается для каждого HTTP-запроса. Например:

   ```java
   @Component
   @Scope(value = WebApplicationContext.SCOPE_REQUEST)
   public class MyRequestBean {
       public MyRequestBean() {
           System.out.println("Создан экземпляр MyRequestBean для HTTP-запроса");
       }
   }
   ```

   Каждый HTTP-запрос будет получать новый экземпляр `MyRequestBean`. Это позволяет сохранять состояние, специфичное для каждого запроса, и освобождать ресурсы после завершения обработки запроса.

+ **Session**: Бин с областью видимости `session` создается для каждой HTTP-сессии. Это означает, что экземпляр будет доступен для всех запросов в рамках одной сессии. Например:

   ```java
   @Component
   @Scope(value = WebApplicationContext.SCOPE_SESSION)
   public class MySessionBean {
       public MySessionBean() {
           System.out.println("Создан экземпляр MySessionBean для HTTP-сессии");
       }
   }
   ```

   Экземпляр `MySessionBean` будет доступен для всех запросов в рамках одной сессии, что позволяет сохранять состояние пользователя между запросами.

Понимание и правильное использование областей видимости бинов в Spring позволяет эффективно управлять ресурсами и состоянием приложения, что является ключевым аспектом разработки на этом фреймворке.




### 43.`Общие области видимости бинов`

В Spring Framework существует несколько областей видимости (scope) для бинов, которые определяют, как и когда создаются экземпляры бинов. Основные области видимости включают:

+ **Singleton**: Это область видимости по умолчанию. В этом случае Spring создает только один экземпляр бина для всего приложения. Этот экземпляр будет использоваться при каждом запросе к этому бину. Например:

   ```java
   @Component
   public class MySingletonBean {
       public MySingletonBean() {
           System.out.println("Создан экземпляр MySingletonBean");
       }
   }
   ```

   При каждом запросе к `MySingletonBean` будет возвращаться один и тот же экземпляр.

+ **Prototype**: При этой области видимости Spring создает новый экземпляр бина каждый раз, когда он запрашивается. Это полезно, когда необходимо иметь уникальный экземпляр бина для каждого запроса. Например:

   ```java
   @Component
   @Scope("prototype")
   public class MyPrototypeBean {
       public MyPrototypeBean() {
           System.out.println("Создан экземпляр MyPrototypeBean");
       }
   }
   ```

   Каждый раз, когда вы запрашиваете `MyPrototypeBean`, будет создаваться новый экземпляр.

+ **Request**: Эта область видимости используется в веб-приложениях. Бин с областью видимости `request` создается для каждого HTTP-запроса. Например:

   ```java
   @Component
   @Scope(value = WebApplicationContext.SCOPE_REQUEST)
   public class MyRequestBean {
       public MyRequestBean() {
           System.out.println("Создан экземпляр MyRequestBean для HTTP-запроса");
       }
   }
   ```

   Каждый HTTP-запрос будет получать новый экземпляр `MyRequestBean`.

+ **Session**: Бин с областью видимости `session` создается для каждой HTTP-сессии. Это означает, что экземпляр будет доступен для всех запросов в рамках одной сессии. Например:

   ```java
   @Component
   @Scope(value = WebApplicationContext.SCOPE_SESSION)
   public class MySessionBean {
       public MySessionBean() {
           System.out.println("Создан экземпляр MySessionBean для HTTP-сессии");
       }
   }
   ```

   Все запросы в рамках одной сессии будут использовать один и тот же экземпляр `MySessionBean`.

+ **Global Session**: Эта область видимости используется в портлетах и создается для каждой глобальной сессии. Она редко используется в обычных веб-приложениях.

Понимание областей видимости бинов в Spring позволяет более эффективно управлять жизненным циклом объектов и их состоянием в приложении.


### 44.`Custom Bean Scopes`

В Spring Framework, помимо стандартных областей видимости бинов, таких как Singleton и Prototype, вы можете создавать собственные области видимости (Custom Bean Scopes). Это может быть полезно, когда вам нужно управлять жизненным циклом бинов в специфических условиях, которые не охватываются стандартными областями видимости.

#### Пример создания пользовательской области видимости

Для создания пользовательской области видимости вам нужно реализовать интерфейс `Scope` и зарегистрировать его в контексте приложения. Рассмотрим пример, в котором мы создадим область видимости, которая будет создавать бины только в определённый момент времени, например, при каждом вызове определённого метода.

1. **Создание класса пользовательской области видимости**:

```java
public class MyCustomScope implements Scope {
    // Реализация методов интерфейса Scope
}
```

2. **Реализация методов интерфейса Scope**:

```java
public class MyCustomScope implements Scope {
    // Реализация методов интерфейса Scope
}
```

3. **Зарегистрирование области видимости в контексте приложения**:

```java
// Регистрация области видимости в контексте приложения
```
### 45.`Web Bean Scopes`

### 46.`Prototype Bean Scope`


## `lesson 10. Lifecycle Callbacks`


### 47.`Измененный Bean Lifecycle`

### 48.`Initialization callbacks`

### 49.`Destruction callbacks`

## `lesson 11. Injection from Properties Files`


### 50.`Зачем использовать properties files`

### 51.`Создание файла application.properties`

### 52.`PropertySourcesPlaceholderConfigurer bean`

### 53.`Expression Language (EL)`

### 54.`Spring Expression Language (SpEL)`

### 55.`SpEL документация`

### 56.`System properties`

## `lesson 12. BeanFactoryPostProcessor (BFPP)`


### 57.`Интерфейс BeanFactoryPostProcessor`

### 58.`Как работает PropertySourcesPlaceholderConfigurer`

### 59.`Измененный Bean Lifecycle`

### 60.`Метод isAssignableFrom`

## `lesson 13. Custom BeanFactoryPostProcessor`

### 61.`Создание собственных BeanFactoryPostProcessor`
### 62.`Интерфейс Ordered`
### 63.`Интерфейс PriorityOrdered`


# 3.`Annotation-based Configuration`

## `lesson 14. Annotation-based Configuration`

### 64.`Подключение зависимости jakarta annotation api`
### 65.`Аннотации @PostConstruct и @PreDestroy`
### 66.`Класс CommonAnnotationBeanPostProcessor`
### 67.`context:annotation-config xml element`




## `lesson 15. BeanPostProcessor (BPP)`

### 68.`Интерфейс BeanPostProcessor`
### 69.`Bean Lifecycle (final version)`
### 70.`Интерфейс Aware`
### 71.`Класс ApplicationContextAwareProcessor`


## `lesson 16. Custom BeanPostProcessor. Часть 1`

### 72.`Создание своей аннотации @InjectBean`
### 73.`Создание InjectBeanPostProcessor`
### 74.`Утилитный класс ReflectionUtils`
### 75.`Тестирование InjectBeanPostProcessor`

## `lesson 17. Custom BeanPostProcessor. Часть 2`

### 76.`Создание аннотации @Transaction`
### 77.`Создание CrudRepository`
### 78.`Создание TransactionBeanPostProcessor`
### 79.`Тестирование TransactionBeanPostProcessor`
### 80.`Корректируем TransactionBeanPostProcessor`
### 81.`Создание AuditingBeanPostProcessor`


## `lesson 18. @Autowired & @Value`

### 82.`Аннотация @Autowired`
### 83.`Аннотация @Resource`
### 84.`Решение конлифкта бинов. @Qualifier`
### 85.`Collection injection`
### 86.`Properties injection. @Value`


## `lesson 19. Classpath Scanning`

### 87.`context:component-scan. Аннотации @Component`
### 88.`Замена бинов из xml на @Component`
### 89.`Тестирование функционала`

## `lesson 20. Bean Definition Readers`

### 90.`Component Scan classes`
### 91.`Bean Definition Readers`
### 92.`Класс ComponentScanBeanDefinitionParser`
### 93.`Класс AnnotatedBeanDefinitionReader`

## `lesson 21. Type Filters`

### 94.`Атрибут annotation-config`
### 95.`Атрибут name-generator`
### 96.`Атрибут resource-pattern`
### 97.`Атрибут scoped-proxy`
### 98.`Атрибут scope-resolver`
### 99.`Атрибут use-default-filters`
### 100.`5 type filters`
### 101.`Custom filters`


## `lesson 22. @Scope`
### 102.`Атрибут scope-resolver`
### 103.`Класс AnnotationScopeMetadataResolver`
### 104.`Аннотация @Scope`


## `lesson 23. JSR 250, JSR 330`

### 105.`Аббревиатура JSR`
### 106.`JSR 250`
### 107.`JSR 330`
### 108.`Класс Jsr330ScopeMetadataResolver`



# 4.`Java-based Configuration`

## `lesson 24. Java-based Configuration`

### 109.`Класс ConfigurationClassBeanDefinitionReader`
### 110.`Создание ApplicationConfiguration. @Configuration`
### 111.`Аннотация @PropertySource`
### 112.`Аннотация @ComponentScan`
### 113.`Класс AnnotationConfigApplicationContext`


## `lesson 25. @Import & @ImportResource`

### 114.`Класс AnnotationConfigApplicationContext`
### 115.`Аннотация @ImportResource`
### 116.`Аннотация @Import`

## `lesson 26. @Bean. Часть 1`

### 117.`Аннотация @Bean`
### 118.`Тестирование Java конфигурации`
### 119.`Свойства аннотации @Bean`
### 120.`Аннотация @Scope с @Bean`
### 121.`Внедрение зависимостей с @Bean`
### 122.`Конфликт имен @Bean и @Component`

## `lesson 27. @Bean. Часть 2`

### 123.`3-ий вариант внедрения зависимостей в @Bean`
### 124.`Cglib proxy в @Configuration`
### 125.`Свойство proxyBeanMethods в @Configuration`
### 126.`@Bean создаются через паттерн Service Locator`

## `lesson 28. Profiles`

### 127.`Environment Bean`
### 128.`Аннотация @Profile`
### 129.`Активация profiles через properties`
### 130.`Активация profiles через ApplicationContext`



# 5.`Event Listeners`


## `lesson 29. Event Listeners. Часть 1`

### 131.`Шаблон проектирования Listener`
### 132.`Создание события (Event)`
### 133.`Создание слушателя событий (Listener). @EventListener`
### 134.`Реализация логики для отправки события`

## `lesson 30. Event Listeners. Часть 2`

### 135.`Bean ApplicationEventPublisher`
### 136.`Тестирование слушателей событий`
### 137.`Listeners order`
### 138.`Listeners conditions`


# 6.`Spring Boot`


## `lesson 31. Spring Boot. Введение`

### 139.`Spring modules`
### 140.`Spring Data Configuration`
### 141.`Modules Auto Configuration`
### 142.`Conditions`
### 143.`Spring Boot Starters`
### 144.`Dependency Management`
### 145.`How to build Spring Boot Application`

## `lesson 32. @Conditional`

### 146.`Аннотация @Conditional`
### 147.`Класс Condition`
### 148.`Custom JpaCondition`
### 149.`Тестирование JpaCondition`
### 150.`Аннотация @Profile`
### 151.`Другие @Condition аннотации`


## `lesson 33. Spring Boot. Настройка проекта`

### 152.`Spring Boot Gradle Plugin`
### 153.`Spring Dependency Management Plugin`
### 154.`spring-boot-starter`
### 155.`Run Spring Boot Application`
### 156.`Autogenerated Spring Boot Project`
### 157.`Maven spring-boot-starter-parent pom`

## `lesson 34. @SpringBootApplication`

### 158.`Структура Spring Boot приложения`
### 159.`Что делает метод SpringApplication.run`
### 160.`Аннотация @SpringBootApplication`
### 161.`Аннотация @SpringBootConfiguration`
### 162.`Аннотация @ComponentScan`
### 163.`Аннотация @PropertySource`
### 164.`Аннотация @EnableAutoConfiguration`


## `lesson 35. Lombok`

### 165.`Подключение Lombok`
### 166.`Gradle Lombok Plugin`
### 167.`IntelliJ IDEA Lombok Plugin`
### 168.`Аннотации Lombok`
### 169.`Файл lombok.config`

## `lesson 36. Properties`

### 170.`Файл spring.properties`
### 171.`Externalized Configuration`
### 172.`Profile-specific properties`
### 173.`Spring program arguments & VM options`
### 174.`Property Placeholders & Default values`
### 175.`spring.config.location`

## `lesson 37. Yaml format`

### 176.`YAML - Yet Another Markup Language`
### 177.`Класс YamlPropertiesFactoryBean`
### 178.`Приоритет properties vs yaml`
### 179.`Переписывание application.properties на yaml`


## `lesson 38. @ConfigurationProperties`

### 180.`Класс JpaProperties`
### 181.`Класс DatabaseProperties`
### 182.`Аннотация @ConfigurationProperties`
### 183.`Аннотация @ConfigurationPropertiesScan`
### 184.`Immutable DatabaseProperties`
### 185.`DatabaseProperties as record`
### 186.`Property key names`



# `7. Logging Starter`


## `lesson 39. Logging Starter`

### 190.`Application as a Black Box`
### 191.`Logging libraries`
### 192.`Log Levels`
### 193.`spring-boot-starter-logging dependency`
### 194.`Аннотация @Slf4j`
### 195.`Delombok annotations`
### 196.`Формат логов по умолчанию`
### 197.`logging.* properties`

## `lesson 40. Logback Configuration`

### 198.`Logback default xml configs`
### 199.`File Output`
### 200.`Custom log configuration`


# `8. Test Starter`

## `lesson 41. Test Starter`

### 201.`Подключение spring-boot-starter-test`
### 202.`Транзитивные зависимости spring-boot-starter-test`
### 203.`Зависимость spring-test`
### 204.`Зависимость spring-boot-test`
### 205.`Зависимость spring-boot-test-autoconfigure`
### 206.`Пример написания Unit тестов`
### 207.`Java Gradle Plugin tasks relationship`

## `lesson 42. Integration Testing. Part 1`


### 208.`Основные цели Spring Integration Testing`
### 209.`Жизненный цикл тестов`
### 210.`JUnit 5 Extension Model`
### 211.`TestContext Framework`
### 212.`SpringExtension source code`

## `lesson 43. Integration Testing. Part 2`

### 213.`Создание CompanyServiceIT`
### 214.`SpringExtension via @ExtendWith`
### 215.`Аннотация @ContextConfiguration`
### 216.`Аннотация @TestPropertySource`
### 217.`Класс ApplicationContextInitializer`
### 218.`Аннотация @SpringBootTest`
### 219.`Написание первого интеграционного теста`
### 220.`Класс DependencyInjectionTestExecutionListener`

## `lesson 44. Integration Testing. Part 3`


### 221.`Аннотация @ActiveProfiles`
### 222.`Custom Test Annotations`
### 223.`Аннотация @TestConstructor`
### 224.`Замена @TestConstructor на spring.properties`

## `lesson 45. Context Caching`


### 225.`Создание нескольких ApplicationContext в тестах`
### 226.`Аннотации @MockBean и @SpyBean`
### 227.`Класс MockitoTestExecutionListener`
### 228.`Аннотация @TestConfiguration`
### 229.`Аннотация @DirtiesContext`


#`9. Data JPA Starter`

## `lesson 46. Data JPA Starter. Введение`

### 230.`Чего не хватало в Hibernate`
### 231.`Установка PostgreSQL`
### 232.`Установка Docker`
### 233.`Postgres Docker Image`
### 234.`Подключение к postgres из IntelliJ IDEA`


## `lesson 47. Data JPA Starter. Подключение`

### 235.`Подключение spring-boot-starter-data-jpa`
### 236.`Зависимости spring-boot-starter-data-jpa`
### 237.`Класс HibernateJpaAutoConfiguration`
### 238.`Настройка spring.datasource и spring.jpa properties`
### 239.`Тестирование приложения`

## `lesson 48. Hibernate Entities`


### 240.`UML диаграмма выполненных sql скриптов`
### 241.`Создание сущности Company`
### 242.`Создание коллекции locales (ElementCollection)`
### 243.`Создание сущности User`
### 244.`Создание сущности Payment`
### 245.`Создание сущности Chat`
### 246.`Создание сущности UserChat`
### 247.`Проверка маппинга сущностей через hbm2ddl.auto`
### 248.`Аннотация @EntityScan`


# `10. Data JPA Transactions`

## `lesson 49. @Transactional. TestContext`

### 249.`Общая структура работы с TransactionManager`
### 250.`Создание CompanyRepository IT`
### 251.`Аннотации @Transactional из Jakarta EE и Spring`
### 252.`Класс TransactionalTestExecutionListener`
### 253.`Аннотации @Commit и @Rollback`

## `lesson 50. TransactionAutoConfiguration`

### 254.`Класс TransactionAutoConfigurationКак происходит обработка транзакций в proxy`
### 255.`Аннотация @Transactional и Cglib proxy`
### 256.`Как работает Cglib proxy с TransactionManager`
### 257.`Как подключить механизм транзакций внутри объекта (не proxy)`
### 258.`Механизм транзакций между несколькими Cglib proxy`


## `lesson 51. @Transactional Settings`

### 259.`Свойства @Transactional. transactionManager`
### 260.`Transaction propagation`
### 261.`Transaction propagation резюме`
### 262.`Transaction isolation`
### 263.`Transaction timeout`
### 264.`ReadOnly transaction`
### 265.`Transaction rollbackFor & rollbackForClassName`
### 266.`Transaction noRollbackFor & noRollbackForClassName`


## `lesson 52. Manual Transactions`

### 267.`Свойства объекта TransactionTemplate`
### 268.`Функционал TransactionTemplate`
### 269.`Обработка checked exceptions`
### 270.`Взаимодействие TransactionTemplate с другими Proxy`
### 271.`Вынесение @Transactional в @IT`


# `11. Data JPA Repositories`

## `lesson 53. Repository`

### 272.`Интерфейс Repository`
### 273.`Написание теста на удаление Company`
### 274.`Класс JpaRepositoryAutoConfiguration`

## `lesson 54. RepositoryQuery`

### 275.`Создание Proxy на классы Repository`
### 276.`Класс QueryExecutorMethodInterceptor`
### 277.`Класс RepositoryQuery`
### 278.`Наследники Repository`

## `lesson 55. PartTreeJpaQuery`

### 279.`Класс PartTreeJpaQuery`
### 280.`Примеры написания запросов`
### 281.`Тестирование запросов`
### 282.`Весь список ключевых слов PartTreeJpaQuery`


## `lesson 56. NamedQuery`

### 283.`Недостатки PartTreeJpaQuery`
### 284.`Класс NamedQuery`
### 285.`Аннотация @NamedQuery`
### 286.`Тестирование NamedQuery`
### 287.`Аннотация @Param`

## `lesson 57. @Query`

### 288.`StoredProcedureJpaQuery`
### 289.`Аннотация @Query`
### 290.`Демонстрация работы @Query`
### 291.`Усовершенствованный оператор LIKE`
### 292.`Native Query`

## `lesson 58. @Modifying`

### 293.`Запрос на обновление через @Query`
### 294.`Аннотация @Modifying`
### 295.`Hibernate PersistenceContext`
### 296.`Свойства clearAutomatically и flushAutomatically`
### 297.`clearAutomatically и LazyInitializationException`

## `lesson 59. Special parameters`

### 298.`Top & First`
### 299.`TopN & FirstN`
### 300.`Класс Sort`
### 301.`Класс Pageable`

## `lesson 60. Page & Slice`

### 302.`Spring классы Streamable, Slice, Page`
### 303.`Демонстрация работы Slice объекта`
### 304.`Почему Slice объекта недостаточно`
### 305.`Демонстрация работы Page объекта`

## `lesson 61. @EntityGraph`

### 306.`Аннотация @EntityGraph`
### 307.`Именованные графы @NamedEntityGraph`
### 308.`Свойство attributePaths в @EntityGraph`
### 309.`Конфликт Pageable при получении EAGER связей`

## `lesson 62. @Lock & @QueryHints`

### 310.`Аннотация @Lock`
### 311.`Демонстрация пессимистических блокировок`
### 312.`Аннотация @QueryHints`

## `lesson 63. Projection`

### 313.`Class-based Projections`
### 314.`Generic Class-based Projections`
### 315.`Interface-based Projections`
### 316.`SpEL in Projections`

## `lesson 64. Custom Repository Implementation`

### 317.`Запрос фильтрации через Custom Implementation`
### 318.`Criteria API для запроса фильтрации`
### 319.`Аннотация @EnableJpaRepository`
### 320.`Тестирование запроса фильтрации`

## `lesson 65. JPA Auditing`

### 321.`Создание AuditingEntity`
### 322.`Аннотация @EnableJpaAuditing`
### 323.`Тестирование @CreatedDate и @LastModifiedDate`
### 324.`Аннотации @CreatedBy и @LastModifiedBy`
### 325.`Создание AuditorAware Bean`
### 326.`Тестирование @CreatedBy и @LastModifiedBy`

## `lesson 66. Hibernate Envers`

### 327.`Подключение Hibernate Envers`
### 328.`Создание сущности Revision`
### 329.`Аннотация @Audited`
### 330.`Аннотация @EnableEnversRepositories`
### 331.`Тестирование Hibernate Envers`
### 332.`Класс RevisionRepository`


## `lesson 67. Querydsl`

### 333.`Подключение Querydsl`
### 334.`Создание QPredicates`
### 335.`Замена Criteria API на Querydsl`
### 336.`Тестирование Querydsl`
### 337.`Класс QuerydslPredicateExecutor`


# `12. JDBC Starter`


## `lesson 68. JDBC Starter`

### 338.`Зависимость spring-boot-starter-jdbc`
### 339.`JdbcTemplateAutoConfiguration`
### 340.`Функционал класса JdbcTemplate`
### 341.`Практика JdbcTemplate`
### 342.`Тестирование функционала`
### 343.`Подключение логов для JdbcTemplate`


## `lesson 69. Batch size & Fetch size`

### 344.`Batch запросы`
### 345.`Batch запрос через JdbcTemplate`
### 346.`Тестирование Batch запроса через JdbcTemplate`
### 347.`Batch запрос через NamedParameterJdbcTemplate`
### 348.`Установка batch_size в Hibernate`
### 349.`Fetch size`




# `13. Databases in tests`

## `lesson 70. In-Memory databases. H2`

### 350.`Два варианта поднятия тестовой базы данных`
### 351.`Подключение H2 database`
### 352.`Аннотация @Sql`

## `lesson 71. Testcontainers`
### 353.`testcontainers lib`
### 354.`Подключение testcontainers`
### 355.`Создание IntegrationTestBase`
### 356.`Тестирование testcontainers`
### 357.`Тестовые данные (ids)`



# `14. Database Migrations`

## `lesson 72. Liquibase. Теория`

### 358.`Устройство migration frameworks`
### 359.`Стуктура Liquibase changelog`
### 360.`Changelog master file`

## `lesson 73. Liquibase. Практика`

### 361.`Подключение зависимости liquibase-core`
### 362.`Класс LiquibaseAutoConfiguration`
### 363.`Создание master changelog`
### 364.`liquibase formatted sql`
### 365.`Тестирование Liquibase`
### 366.`Добавление нового changelog (envers tables)`
### 367.`md5sum`
### 368.`Использование Liquibase в тестах`


# `15. Web Starter`

## `lesson 74. Web Starter. Введение`

### 369.`MVC и классические web-приложения`
### 370.`web-приложение на Spring Boot`
### 371.`Embedded Tomcat`
### 372.`Настройка spring-web приложения`
### 373.`Класс WebMvcAutoConfiguration`


## `lesson 75. Dispatcher Servlet`

### 374.`Жизненный цикл сервлетов`
### 375.`Псевдокод метода service в DispatcherServlet`
### 376.`Исходный код класса DispatcherServlet`


## `lesson 76. @Controller`

### 377.`Подключение зависимостей и настройка view resolver`
### 378.`Создание контроллера. @Controller`


## `lesson 77. @RequestMapping`

### 379.`Основные составляющие HTTP запроса и HTTP ответа`
### 380.`Основные составляющие URL`
### 381.`Аннотации @RequestMapping`


## `lesson 78. Parameters, Headers, Cookies`

### 382.`Parameters. @RequestParam annotation`
### 383.`Headers. @RequestHeader annotation`
### 384.`Cookies. @CookieValue annotation`
### 385.`Method params naming`
### 386.`DispatcherServlet sources`
### 387.`@PathVariable annotation`


## `lesson 79. Model`

### 388.`Attributes`
### 389.`Добавление Request атрибутов в Model`
### 390.`Добавление Session атрибутов в Model`
### 391.`DispatcherServlet sources`


## `lesson 80. @ModelAttribute`

### 392.`Упрощение работы с объектом ModelAndView`
### 393.`Динамическое создание атрибутов`
### 394.`Аннотация @ModelAttribute`
### 395.`HTML Form. LoginController`


## `lesson 81. Forward, Include, Redirect`

### 396.`3 вида перенаправления запросов`
### 397.`forward in Spring`
### 398.`redirect in Spring`

## `lesson 82. CRUD. API Design`

### 399.`API design best practices`
### 400.`CRUD. Method findAll`
### 401.`CRUD. Method findById`
### 402.`CRUD. Method create`
### 403.`CRUD. Method update`
### 404.`CRUD. Method delete`


## `lesson 83. CRUD. Service Layer`

### 405.`UserService. Method findAll`
### 406.`UserService. Method findById`
### 407.`UserService. Method create`
### 408.`@Transactional annotation`
### 409.`UserService. Method update`
### 410.`UserService. Method delete`
### 411.`Test UserService functionality`
### 412.`Tips. Method delete`

## `lesson 84. Spring MVC Testing`

### 413.`Аннотация @AutoConfigureMockMvc`
### 414.`Test findAll method`
### 415.`Transactions. spring.jpa.open-in-view property`
### 416.`Test create method`
### 417.`Problem with sending dates in params`

## `lesson 85. Type Converters`

### 418.`spring.mvc.format properties`
### 419.`Аннотация @DateTimeFormat`
### 420.`Интерфейс WebMvcConfigurer`


# `16. Thymeleaf`

## `lesson 86. Thymeleaf Starter. Введение`

### 421.`View Resolvers`
### 422.`Thymeleaf Template Engine Intro`
### 423.`Настройка Thymeleaf в проекте`
### 424.`Использование Thymeleaf`
### 425.`Тестирование функционала`

## `lesson 87. CRUD. View Layer. Часть 1`

### 426.`Создание users.html для метода findAll`
### 427.`Создание user.html для метода findById`
### 428.`Тестирование функционала`
### 429.`Добавление кнопки для метода delete`

## `lesson 88. CRUD. View Layer. Часть 2`

### 430.`Создание registration endpoint`
### 431.`Создание registration.html`
### 432.`Тестирование функционала registration`
### 433.`redirect с сохранением введенных параметров`

## `lesson 89. Filter Query`

### 434.`Add UserFilter - Controller & Service layers`
### 435.`Add UserFilter - users.html`
### 436.`Тестирование функционала`

## `lesson 90. Pagination. Best practices`

### 437.`HTTP endpoints best practices`
### 438.`2 options of pagination implementation`
### 439.`offset-based pagination`
### 440.`PageableArgumentResolver`
### 441.`Building PageResponse`
### 442.`Тестирование функционала`


# `17. Validation Starter`

## `lesson 91. Validation Starter. Введение`

### 443.`Подключение validation starter`
### 444.`Validation annotations`
### 445.`How to use annotations in practice`
### 446.`@Valid & @Validated`
### 447.`BindingResult object`
### 448.`Show validation errors on the page`
### 449.`Тестирование функционала`

## `lesson 92. Custom validator`

### 450.`Main parts in JSR 303 annotations`
### 451.`Custom annotation @UserInfo`
### 452.`Тестирование функционала`
### 453.`Configuration properties validation`
### 454.`Validation groups`

## `lesson 93. @ControllerAdvice & @ExceptionHandler`

### 455.`@ExceptionHandler annotation`
### 456.`Тестирование функционала`
### 457.`@ControllerAdvice annotation`
### 458.`Класс ResponseEntityExceptionHandler`


# `18. REST`

## `lesson 94. REST. Введение`

### 459.`Проблемы Controller API`
### 460.`REST API`
### 461.`REST API Usages`

## `lesson 95. REST. Практика`

### 462.`@ResponseBody & findAll method`
### 463.`findById method`
### 464.`@RequestBody & create method`
### 465.`update method`
### 466.`delete method`
### 467.`@RestController`
### 468.`@RestControllerAdvice`

## `lesson 96. Swagger. API docs`

### 469.`Rest clients`
### 470.`Подключение springdoc`
### 471.`Сгенерированная документация для Rest Controllers`
### 472.`Swagger ui`
### 473.`Swagger annotations`

## `lesson 97. Upload image`

### 474.`Добавление новой колонки image в таблице users`
### 475.`Создание ImageService`
### 476.`upload images from html pages. MultipartFile`
### 477.`Тестирование функционала`

## `lesson 98. Get image`

### 478.`Реализация функционала на уровне service`
### 479.`Отображение картинки на html странице`
### 480.`Реализация функционала на уровне rest controller`
### 481.`Тестирование функционала`
### 482.`Отображение отсутствующей картинки`
### 483.`Класс ResponseEntity`

# `19. Security Starter`

## `lesson 99. Security Starter. Введение`

### 484.`Понятия Аутентификация и Авторизация`
### 485.`Servlet Filters mechanism`
### 486.`Spring Servlet Filters mechanism`
### 487.`Подключение Spring Security Starter`

## `lesson 100. Authentication Architecture`

### 488.`Spring Security Model`
### 489.`Spring Security Authentication Logic`
### 490.`Debug Security filters (default behaviour)`

## `lesson 101. DaoAuthenticationProvider`

### 491.`DaoAuthenticationProvider source code`
### 492.`Add column password into users table`
### 493.`Update entity & enum`
### 494.`Implement UserDetailsService`
### 495.`Тестирование функциональности`

## `lesson 102. Form Login`

### 496.`Default login page source code`
### 497.`Custom login page`
### 498.`Customise SecurityFilterChain`
### 499.`Тестирование функицонала`
### 500.`Class UsernamePasswordAuthenticationFilter`

## `lesson 103. HTTP Basic Authentication`

### 501.`HTTP Basic Authentication principle`
### 502.`HTTP Basic encoder & decoder`
### 503.`Customise SecurityFilterChain to support HTTP Basic`
### 504.`BasicAuthenticationFilter source code`

## `lesson 104. PasswordEncoder`

### 505.`Зачем шифровать пароли`
### 506.`List of password encoders`
### 507.`Implement password encode/decode in the app`
### 508.`Тестирование функционала`

## `lesson 105. Logout`

### 509.`LogoutFilter source code`
### 510.`Customise logout in SecurityFilterChain`
### 511.`Add button Logout on pages`
### 512.`Тестирование функционала`

## `lesson 106. Authorization Architecture`

### 513.`AuthorizationFilter source code and logic`
### 514.`AuthorizationFilter implementations`
### 515.`Customise authorizeHttpRequests in SecurityFilterChain`
### 516.`Тестирование функционала`

## `lesson 107. Method Security`

### 517.`@PreAuthorize annotation`
### 518.`@PostAuthorize annotation`
### 519.`@EnableMethodSecurity annotation`
### 520.`@Secured annotation`
### 521.`Service layer authentication`
### 522.`@PreFilter & @PostFilter annotations`



## `lesson 108. Access to authenticated user`

### 523.`Get current user via SecurityContextHolder`
### 524.`@CurrentSecutiryContext annotation`
### 525.`@AuthenticationPrincipal annotation`
### 526.`Thymeleaf and Spring Security integration`

## `lesson 109. CSRF Filter`

### 527.`Cross-Site Request Forgery`
### 528.`How to solve CSRF problem`
### 529.`Synchronizer Token Pattern`
### 530.`When to use CSRF protection`
### 531.`CsrfFilter source code`
### 532.`How to work with CSRF token`
### 533.`Class CsrfRequestDataValueProcessor`
### 534.`Тестирование функционала`

## `lesson 110. Security Testing`

### 536.`Исправление существующих тестов`
### 537.`spring-security-test dependency`
### 538.`1. Manually define a user in tests`
### 539.`2. @WithMockUser annotation`
### 540.`3. SecurityMockMvcRequestPostProcessor`

## `lesson 111. OAuth 2.0. Теория`

### 541.`Текущий Authentication функционал в приложении`
### 542.`Что такое OAuth 2`
### 543.`Как внедрить OAuth 2 в приложении`
### 544.`OAuth 2 flow types`
### 545.`OAuth 2 Authorization Code Flow`
### 546.`OAuth 2 Implicit Flow`
### 547.`OpenID Connect (OIDC)`

## `lesson 112. OAuth 2.0. Практика`

### 548.`Create a new project in GCP`
### 549.`Configure OAuth 2 in the project`
### 550.`Configure Login Page`
### 551.`Тестирование функционала`

## `lesson 113. OAuth 2.0. Authentication Principle`

### 552.`Add UserInfoEndpoint config in SecurityFilterChain`
### 553.`Create oidcUserService`
### 554.`Тестирование функционала`

## `lesson 114. JWT. JSON Web Token`


### 555.`How to extract info from JWT`
### 556.`JWT header`
### 557.`JWT payload`
### 558.`JWT signature`
### 559.`Code Book`

## `lesson 115. Swagger Authorization`

### 560.`3 options to pass authorization in Swagger`
### 561.`springdoc properties to support OAuth 2`
### 562.`@SecurityScheme configuration`
### 563.`Тестирование функционала`



# `20. i18n & l10n`


## `lesson 116. i18n. MessageSource`

### 564.`spring.messages properties`
### 565.`IntelliJ IDEA UTF-8 settings`
### 566.`Creating MessageRestController`
### 567.`Тестирование функционала`

## `lesson 117. i18n. Thymeleaf`

### 568.`Login page i18n`
### 569.`How to change the language`
### 570.`LocalChangeInterceptor bean`
### 571.`LocaleResolver bean`
### 572.`Тестирование функционала`

# `21. AOP Starter`

## `lesson 118. AOP Starter. Введение`

### 573.`Усложнение кода второстепенной логикой`
### 574.`Crosscutting concerns`
### 575.`AOP terminology`
### 576.`AOP approaches`

## `lesson 119. AOP. Pointcut`

### 577.`spring-boot-starter-aop dependency`
### 578.`AspectJ annotations`
### 579.`@Pointcut`
### 580.`@within`
### 581.`within`
### 582.`this & target`
### 583.`@annotation`
### 584.`args`
### 585.`@args`
### 586.`bean`
### 587.`execution`

## `lesson 120. AOP. @Before Advice`

### 588.`@Before annotation`
### 589.`Тестирование функционала`
### 590.`CglibAopProxy`
### 591.`Proxy interceptors`
### 592.`Spring AOP diagram`
### 593.`AopAutoConfiguration`

## `lesson 121. AOP. JoinPoint. Params`

### 594.`JoinPoint object`
### 595.`Get access to proxy data from advice method params`
### 596.`Тестирование функционала`
### 597.`argNames`

## `lesson 122. AOP. @After Advices`

### 598.`All types of advice`
### 599.`@AfterReturning annotation`
### 600.`@AfterThrowing annotation`
### 601.`@After annotation`
### 602.`Тестирование функционала`

## `lesson 123. AOP. @Around Advice`

### 603.`TransactionInterceptor`
### 604.`@Around annotation`
### 605.`Тестирование функционала`

## `lesson 124. AOP. Best Practices`

### 606.`1. Combine different Pointcut types`
### 607.`2. Move common Pointcuts to separate Aspect`
### 608.`3. Don t use @Around advice everywhere`
### 609.`4. Separate Pointcuts by business logic`
### 610.`Aspects order`


# `22. Заключение`

## `lesson 125. Custom Spring Boot Starter`

### 611.`Create a new Gradle module`
### 612.`Define starter properties`
### 613.`Create Autoconfiguration`
### 614.`File META-INF/spring.factories`
### 615.`Move Aspects from the old to the new module`
### 616.`How to use newly created starter`
### 617.`spring-boot-configuration-processor`
### 618.`Тестирование функционала`

## `lesson 126. Заключение. Путь развития`

### 619.`Spring Framework Documentation`
### 620.`List of all main Spring Boot Starters`
### 621.`Java Road Map`