You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devel/Курс Spring Framework.md

169 KiB

Spring-starter

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

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

Содержание

1. Intro

lesson 1. Введение

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

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

  1. Установка Java 17
  2. Установка IntelliJ IDEA Ultimate Edition
  3. Установка PostgreSQL
  4. Установка Docker
  5. Создание нового проекта

lesson 3. Inversion of Control. Dependency Injection

  1. Object Dependencies
  2. Object Dependencies в коде
  3. Inversion of Control & Dependency Injection
  4. Inversion of Control & Dependency Injection в коде
  5. 3 способа внедрения зависимостей в объекте

lesson 4. IoC Container

  1. Spring IoC Container
  2. Bean
  3. Bean Definition
  4. POJO
  5. Основные интерфейсы IoC Container
  6. 3 способа создания Bean Definitions

2. XML-based Configuration

lesson 5. XML-based Configuration

  1. BeanFactory и ApplicationContext интерфейсы
  2. ClassPathXmlApplicationContext
  3. XML config
  4. Идентификаторы (id) бинов как ключи в IoC Container
  5. Алиасы бинов (alias)

lesson 6. Constructor Injection

  1. Внедрение примитивных типов данных
  2. Внедрение коллекций list/set
  3. Внедрение ассоциативного массива map
  4. Поле genericArgumentValues в BeanDefinition
  5. Поле indexedArgumentValues в BeanDefinition
  6. Указание атрибута type в параметрах конструктора
  7. Указание атрибута name в параметрах конструктора

lesson 7. Factory Method Injection

  1. Внедрение других бинов через ref*
  2. Создание новое бина CompanyRepository
  3. Внедрение зависимостей через factory method
  4. Атрибут factory-bean (паттерн ServiceLocator)

lesson 8. Property Injection

  1. Использование set* методов в ConnectionPool
  2. Поле propertyValues в BeanDefinition
  3. Упрощенный жизненный цикл бинов - Bean Lifecycle
  4. Плюсы и минусы Constructor и Property Injections
  5. Циклические зависимости через Property Injection

lesson 9. Bean Scopes

  1. Common Bean Scopes
  2. Custom Bean Scopes
  3. Web Bean Scopes
  4. Prototype Bean Scope

lesson 10. Lifecycle Callbacks

  1. Измененный Bean Lifecycle
  2. Initialization callbacks
  3. Destruction callbacks

lesson 11. Injection from Properties Files

  1. Зачем использовать properties files
  2. Создание файла application.properties
  3. PropertySourcesPlaceholderConfigurer bean
  4. Expression Language (EL)
  5. Spring Expression Language (SpEL)
  6. SpEL документация
  7. System properties

lesson 12. BeanFactoryPostProcessor (BFPP)

  1. Интерфейс BeanFactoryPostProcessor
  2. Как работает PropertySourcesPlaceholderConfigurer
  3. Измененный Bean Lifecycle
  4. Метод isAssignableFrom

lesson 13. Custom BeanFactoryPostProcessor

  1. Создание собственных BeanFactoryPostProcessor
  2. Интерфейс Ordered
  3. Интерфейс PriorityOrdered

3. Annotation-based Configuration

lesson 14. Annotation-based Configuration

  1. Подключение зависимости jakarta annotation api
  2. Аннотации @PostConstruct и @PreDestroy
  3. Класс CommonAnnotationBeanPostProcessor
  4. context:annotation-config xml element

lesson 15. BeanPostProcessor (BPP)

  1. Интерфейс BeanPostProcessor
  2. Bean Lifecycle (final version)
  3. Интерфейс Aware
  4. Класс ApplicationContextAwareProcessor

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

  1. Создание своей аннотации @InjectBean
  2. Создание InjectBeanPostProcessor
  3. Утилитный класс ReflectionUtils
  4. Тестирование InjectBeanPostProcessor

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

  1. Создание аннотации @Transaction
  2. Создание CrudRepository
  3. Создание TransactionBeanPostProcessor
  4. Тестирование TransactionBeanPostProcessor
  5. Корректируем TransactionBeanPostProcessor
  6. Создание AuditingBeanPostProcessor

lesson 18. @Autowired & @Value

  1. Аннотация @Autowired
  2. Аннотация @Resource
  3. Решение конлифкта бинов. @Qualifier
  4. Collection injection
  5. Properties injection. @Value

lesson 19. Classpath Scanning

  1. context:component-scan. Аннотации @Component
  2. Замена бинов из xml на @Component
  3. Тестирование функционала

lesson 20. Bean Definition Readers

  1. Component Scan classes
  2. Bean Definition Readers
  3. Класс ComponentScanBeanDefinitionParser
  4. Класс AnnotatedBeanDefinitionReader

lesson 21. Type Filters

  1. Атрибут annotation-config
  2. Атрибут name-generator
  3. Атрибут resource-pattern
  4. Атрибут scoped-proxy
  5. Атрибут scope-resolver
  6. Атрибут use-default-filters
  7. 5 type filters
  8. Custom filters

lesson 22. @Scope

  1. Атрибут scope-resolver
  2. Класс AnnotationScopeMetadataResolver
  3. Аннотация @Scope

lesson 23. JSR 250, JSR 330

  1. Аббревиатура JSR
  2. JSR 250
  3. JSR 330
  4. Класс Jsr330ScopeMetadataResolver

4. Java-based Configuration

lesson 24. Java-based Configuration

  1. Класс ConfigurationClassBeanDefinitionReader
  2. Создание ApplicationConfiguration. @Configuration
  3. Аннотация @PropertySource
  4. Аннотация @ComponentScan
  5. Класс AnnotationConfigApplicationContext

lesson 25. @Import & @ImportResource

  1. Класс AnnotationConfigApplicationContext
  2. Аннотация @ImportResource
  3. Аннотация @Import

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

  1. Аннотация @Bean
  2. Тестирование Java конфигурации
  3. Свойства аннотации @Bean
  4. Аннотация @Scope с @Bean
  5. Внедрение зависимостей с @Bean
  6. Конфликт имен @Bean и @Component

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

  1. 3-ий вариант внедрения зависимостей в @Bean
  2. Cglib proxy в @Configuration
  3. Свойство proxyBeanMethods в @Configuration
  4. @Bean создаются через паттерн Service Locator

lesson 28. Profiles

  1. Environment Bean
  2. Аннотация @Profile
  3. Активация profiles через properties
  4. Активация profiles через ApplicationContext

5. Event Listeners

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

  1. Шаблон проектирования Listener
  2. Создание события (Event)
  3. Создание слушателя событий (Listener). @EventListener
  4. Реализация логики для отправки события

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

  1. Bean ApplicationEventPublisher
  2. Тестирование слушателей событий
  3. Listeners order
  4. Listeners conditions

6. Spring Boot

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

  1. Spring modules
  2. Spring Data Configuration
  3. Modules Auto Configuration
  4. Conditions
  5. Spring Boot Starters
  6. Dependency Management
  7. How to build Spring Boot Application

lesson 32. @Conditional

  1. Аннотация @Conditional
  2. Класс Condition
  3. Custom JpaCondition
  4. Тестирование JpaCondition
  5. Аннотация @Profile
  6. Другие @Condition аннотации

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

  1. Spring Boot Gradle Plugin
  2. Spring Dependency Management Plugin
  3. spring-boot-starter
  4. Run Spring Boot Application
  5. Autogenerated Spring Boot Project
  6. Maven spring-boot-starter-parent pom

lesson 34. @SpringBootApplication

  1. Структура Spring Boot приложения
  2. Что делает метод SpringApplication.run
  3. Аннотация @SpringBootApplication
  4. Аннотация @SpringBootConfiguration
  5. Аннотация @ComponentScan
  6. Аннотация @PropertySource
  7. Аннотация @EnableAutoConfiguration

lesson 35. Lombok

  1. Подключение Lombok
  2. Gradle Lombok Plugin
  3. IntelliJ IDEA Lombok Plugin
  4. Аннотации Lombok
  5. Файл lombok.config

lesson 36. Properties

  1. Файл spring.properties
  2. Externalized Configuration
  3. Profile-specific properties
  4. Spring program arguments & VM options
  5. Property Placeholders & Default values
  6. spring.config.location

lesson 37. Yaml format

  1. YAML - Yet Another Markup Language
  2. Класс YamlPropertiesFactoryBean
  3. Приоритет properties vs yaml
  4. Переписывание application.properties на yaml

lesson 38. @ConfigurationProperties

  1. Класс JpaProperties
  2. Класс DatabaseProperties
  3. Аннотация @ConfigurationProperties
  4. Аннотация @ConfigurationPropertiesScan
  5. Immutable DatabaseProperties
  6. DatabaseProperties as record
  7. Property key names

7. Logging Starter

lesson 39. Logging Starter

  1. Application as a Black Box
  2. Logging libraries
  3. Log Levels
  4. spring-boot-starter-logging dependency
  5. Аннотация @Slf4j
  6. Delombok annotations
  7. Формат логов по умолчанию
  8. logging.* properties

lesson 40. Logback Configuration

  1. Logback default xml configs
  2. File Output
  3. Custom log configuration

8. Test Starter

lesson 41. Test Starter

  1. Подключение spring-boot-starter-test
  2. Транзитивные зависимости spring-boot-starter-test
  3. Зависимость spring-test
  4. Зависимость spring-boot-test
  5. Зависимость spring-boot-test-autoconfigure
  6. Пример написания Unit тестов
  7. Java Gradle Plugin tasks relationship

lesson 42. Integration Testing. Part 1

  1. Основные цели Spring Integration Testing
  2. Жизненный цикл тестов
  3. JUnit 5 Extension Model
  4. TestContext Framework
  5. SpringExtension source code

lesson 43. Integration Testing. Part 2

  1. Создание CompanyServiceIT
  2. SpringExtension via @ExtendWith
  3. Аннотация @ContextConfiguration
  4. Аннотация @TestPropertySource
  5. Класс ApplicationContextInitializer
  6. Аннотация @SpringBootTest
  7. Написание первого интеграционного теста
  8. Класс DependencyInjectionTestExecutionListener

lesson 44. Integration Testing. Part 3

  1. Аннотация @ActiveProfiles
  2. Custom Test Annotations
  3. Аннотация @TestConstructor
  4. Замена @TestConstructor на spring.properties

lesson 45. Context Caching

  1. Создание нескольких ApplicationContext в тестах
  2. Аннотации @MockBean и @SpyBean
  3. Класс MockitoTestExecutionListener
  4. Аннотация @TestConfiguration
  5. Аннотация @DirtiesContext

9. Data JPA Starter

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

  1. Чего не хватало в Hibernate
  2. Установка PostgreSQL
  3. Установка Docker
  4. Postgres Docker Image
  5. Подключение к postgres из IntelliJ IDEA

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

  1. Подключение spring-boot-starter-data-jpa
  2. Зависимости spring-boot-starter-data-jpa
  3. Класс HibernateJpaAutoConfiguration
  4. Настройка spring.datasource и spring.jpa properties
  5. Тестирование приложения

lesson 48. Hibernate Entities

  1. UML диаграмма выполненных sql скриптов
  2. Создание сущности Company
  3. Создание коллекции locales (ElementCollection)
  4. Создание сущности User
  5. Создание сущности Payment
  6. Создание сущности Chat
  7. Создание сущности UserChat
  8. Проверка маппинга сущностей через hbm2ddl.auto
  9. Аннотация @EntityScan

10. Data JPA Transactions

lesson 49. @Transactional. TestContext

  1. Общая структура работы с TransactionManager
  2. Создание CompanyRepository IT
  3. Аннотации @Transactional из Jakarta EE и Spring
  4. Класс TransactionalTestExecutionListener
  5. Аннотации @Commit и @Rollback

lesson 50. TransactionAutoConfiguration

  1. Класс TransactionAutoConfigurationКак происходит обработка транзакций в proxy
  2. Аннотация @Transactional и Cglib proxy
  3. Как работает Cglib proxy с TransactionManager
  4. Как подключить механизм транзакций внутри объекта (не proxy)
  5. Механизм транзакций между несколькими Cglib proxy

lesson 51. @Transactional Settings

  1. Свойства @Transactional. transactionManager
  2. Transaction propagation
  3. Transaction propagation резюме
  4. Transaction isolation
  5. Transaction timeout
  6. ReadOnly transaction
  7. Transaction rollbackFor & rollbackForClassName
  8. Transaction noRollbackFor & noRollbackForClassName

lesson 52. Manual Transactions

  1. Свойства объекта TransactionTemplate
  2. Функционал TransactionTemplate
  3. Обработка checked exceptions
  4. Взаимодействие TransactionTemplate с другими Proxy
  5. Вынесение @Transactional в @IT

11. Data JPA Repositories

lesson 53. Repository

  1. Интерфейс Repository
  2. Написание теста на удаление Company
  3. Класс JpaRepositoryAutoConfiguration

lesson 54. RepositoryQuery

  1. Создание Proxy на классы Repository
  2. Класс QueryExecutorMethodInterceptor
  3. Класс RepositoryQuery
  4. Наследники Repository

lesson 55. PartTreeJpaQuery

  1. Класс PartTreeJpaQuery
  2. Примеры написания запросов
  3. Тестирование запросов
  4. Весь список ключевых слов PartTreeJpaQuery

lesson 56. NamedQuery

  1. Недостатки PartTreeJpaQuery
  2. Класс NamedQuery
  3. Аннотация @NamedQuery
  4. Тестирование NamedQuery
  5. Аннотация @Param

lesson 57. @Query

  1. StoredProcedureJpaQuery
  2. Аннотация @Query
  3. Демонстрация работы @Query
  4. Усовершенствованный оператор LIKE
  5. Native Query

lesson 58. @Modifying

  1. Запрос на обновление через @Query
  2. Аннотация @Modifying
  3. Hibernate PersistenceContext
  4. Свойства clearAutomatically и flushAutomatically
  5. clearAutomatically и LazyInitializationException

lesson 59. Special parameters

  1. Top & First
  2. TopN & FirstN
  3. Класс Sort
  4. Класс Pageable

lesson 60. Page & Slice

  1. Spring классы Streamable, Slice, Page
  2. Демонстрация работы Slice объекта
  3. Почему Slice объекта недостаточно
  4. Демонстрация работы Page объекта

lesson 61. @EntityGraph

  1. Аннотация @EntityGraph
  2. Именованные графы @NamedEntityGraph
  3. Свойство attributePaths в @EntityGraph
  4. Конфликт Pageable при получении EAGER связей

lesson 62. @Lock & @QueryHints

  1. Аннотация @Lock
  2. Демонстрация пессимистических блокировок
  3. Аннотация @QueryHints

lesson 63. Projection

  1. Class-based Projections
  2. Generic Class-based Projections
  3. Interface-based Projections
  4. SpEL in Projections

lesson 64. Custom Repository Implementation

  1. Запрос фильтрации через Custom Implementation
  2. Criteria API для запроса фильтрации
  3. Аннотация @EnableJpaRepository
  4. Тестирование запроса фильтрации

lesson 65. JPA Auditing

  1. Создание AuditingEntity
  2. Аннотация @EnableJpaAuditing
  3. Тестирование @CreatedDate и @LastModifiedDate
  4. Аннотации @CreatedBy и @LastModifiedBy
  5. Создание AuditorAware Bean
  6. Тестирование @CreatedBy и @LastModifiedBy

lesson 66. Hibernate Envers

  1. Подключение Hibernate Envers
  2. Создание сущности Revision
  3. Аннотация @Audited
  4. Аннотация @EnableEnversRepositories
  5. Тестирование Hibernate Envers
  6. Класс RevisionRepository

lesson 67. Querydsl

  1. Подключение Querydsl
  2. Создание QPredicates
  3. Замена Criteria API на Querydsl
  4. Тестирование Querydsl
  5. Класс QuerydslPredicateExecutor

12. JDBC Starter

lesson 68. JDBC Starter

  1. Зависимость spring-boot-starter-jdbc
  2. JdbcTemplateAutoConfiguration
  3. Функционал класса JdbcTemplate
  4. Практика JdbcTemplate
  5. Тестирование функционала
  6. Подключение логов для JdbcTemplate

lesson 69. Batch size & Fetch size

  1. Batch запросы
  2. Batch запрос через JdbcTemplate
  3. Тестирование Batch запроса через JdbcTemplate
  4. Batch запрос через NamedParameterJdbcTemplate
  5. Установка batch_size в Hibernate
  6. Fetch size

13. Databases in tests

lesson 70. In-Memory databases. H2

  1. Два варианта поднятия тестовой базы данных
  2. Подключение H2 database
  3. Аннотация @Sql

lesson 71. Testcontainers

  1. testcontainers lib
  2. Подключение testcontainers
  3. Создание IntegrationTestBase
  4. Тестирование testcontainers
  5. Тестовые данные (ids)

14. Database Migrations

lesson 72. Liquibase. Теория

  1. Устройство migration frameworks
  2. Стуктура Liquibase changelog
  3. Changelog master file

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

  1. Подключение зависимости liquibase-core
  2. Класс LiquibaseAutoConfiguration
  3. Создание master changelog
  4. liquibase formatted sql
  5. Тестирование Liquibase
  6. Добавление нового changelog (envers tables)
  7. md5sum
  8. Использование Liquibase в тестах

15. Web Starter

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

  1. MVC и классические web-приложения
  2. web-приложение на Spring Boot
  3. Embedded Tomcat
  4. Настройка spring-web приложения
  5. Класс WebMvcAutoConfiguration

lesson 75. Dispatcher Servlet

  1. Жизненный цикл сервлетов
  2. Псевдокод метода service в DispatcherServlet
  3. Исходный код класса DispatcherServlet

lesson 76. @Controller

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

lesson 77. @RequestMapping

  1. Основные составляющие HTTP запроса и HTTP ответа
  2. Основные составляющие URL
  3. Аннотации @RequestMapping

lesson 78. Parameters, Headers, Cookies

  1. Parameters. @RequestParam annotation
  2. Headers. @RequestHeader annotation
  3. Cookies. @CookieValue annotation
  4. Method params naming
  5. DispatcherServlet sources
  6. @PathVariable annotation

lesson 79. Model

  1. Attributes
  2. Добавление Request атрибутов в Model
  3. Добавление Session атрибутов в Model
  4. DispatcherServlet sources

lesson 80. @ModelAttribute

  1. Упрощение работы с объектом ModelAndView
  2. Динамическое создание атрибутов
  3. Аннотация @ModelAttribute
  4. HTML Form. LoginController

lesson 81. Forward, Include, Redirect

  1. 3 вида перенаправления запросов
  2. forward in Spring
  3. redirect in Spring

lesson 82. CRUD. API Design

  1. API design best practices
  2. CRUD. Method findAll
  3. CRUD. Method findById
  4. CRUD. Method create
  5. CRUD. Method update
  6. CRUD. Method delete

lesson 83. CRUD. Service Layer

  1. UserService. Method findAll
  2. UserService. Method findById
  3. UserService. Method create
  4. @Transactional annotation
  5. UserService. Method update
  6. UserService. Method delete
  7. Test UserService functionality
  8. Tips. Method delete

lesson 84. Spring MVC Testing

  1. Аннотация @AutoConfigureMockMvc
  2. Test findAll method
  3. Transactions. spring.jpa.open-in-view property
  4. Test create method
  5. Problem with sending dates in params

lesson 85. Type Converters

  1. spring.mvc.format properties
  2. Аннотация @DateTimeFormat
  3. Интерфейс WebMvcConfigurer

16. Thymeleaf

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

  1. View Resolvers
  2. Thymeleaf Template Engine Intro
  3. Настройка Thymeleaf в проекте
  4. Использование Thymeleaf
  5. Тестирование функционала

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

  1. Создание users.html для метода findAll
  2. Создание user.html для метода findById
  3. Тестирование функционала
  4. Добавление кнопки для метода delete

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

  1. Создание registration endpoint
  2. Создание registration.html
  3. Тестирование функционала registration
  4. redirect с сохранением введенных параметров

lesson 89. Filter Query

  1. Add UserFilter - Controller & Service layers
  2. Add UserFilter - users.html
  3. Тестирование функционала

lesson 90. Pagination. Best practices

  1. HTTP endpoints best practices
  2. 2 options of pagination implementation
  3. offset-based pagination
  4. PageableArgumentResolver
  5. Building PageResponse
  6. Тестирование функционала

17. Validation Starter

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

  1. Подключение validation starter
  2. Validation annotations
  3. How to use annotations in practice
  4. @Valid & @Validated
  5. BindingResult object
  6. Show validation errors on the page
  7. Тестирование функционала

lesson 92. Custom validator

  1. Main parts in JSR 303 annotations
  2. Custom annotation @UserInfo
  3. Тестирование функционала
  4. Configuration properties validation
  5. Validation groups

lesson 93. @ControllerAdvice & @ExceptionHandler

  1. @ExceptionHandler annotation
  2. Тестирование функционала
  3. @ControllerAdvice annotation
  4. Класс ResponseEntityExceptionHandler

18. REST

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

  1. Проблемы Controller API
  2. REST API
  3. REST API Usages

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

  1. @ResponseBody & findAll method
  2. findById method
  3. @RequestBody & create method
  4. update method
  5. delete method
  6. @RestController
  7. @RestControllerAdvice

lesson 96. Swagger. API docs

  1. Rest clients
  2. Подключение springdoc
  3. Сгенерированная документация для Rest Controllers
  4. Swagger ui
  5. Swagger annotations

lesson 97. Upload image

  1. Добавление новой колонки image в таблице users
  2. Создание ImageService
  3. upload images from html pages. MultipartFile
  4. Тестирование функционала

lesson 98. Get image

  1. Реализация функционала на уровне service
  2. Отображение картинки на html странице
  3. Реализация функционала на уровне rest controller
  4. Тестирование функционала
  5. Отображение отсутствующей картинки
  6. Класс ResponseEntity

19. Security Starter

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

  1. Понятия Аутентификация и Авторизация
  2. Servlet Filters mechanism
  3. Spring Servlet Filters mechanism
  4. Подключение Spring Security Starter

lesson 100. Authentication Architecture

  1. Spring Security Model
  2. Spring Security Authentication Logic
  3. Debug Security filters (default behaviour)

lesson 101. DaoAuthenticationProvider

  1. DaoAuthenticationProvider source code
  2. Add column password into users table
  3. Update entity & enum
  4. Implement UserDetailsService
  5. Тестирование функциональности

lesson 102. Form Login

  1. Default login page source code
  2. Custom login page
  3. Customise SecurityFilterChain
  4. Тестирование функицонала
  5. Class UsernamePasswordAuthenticationFilter

lesson 103. HTTP Basic Authentication

  1. HTTP Basic Authentication principle
  2. HTTP Basic encoder & decoder
  3. Customise SecurityFilterChain to support HTTP Basic
  4. BasicAuthenticationFilter source code

lesson 104. PasswordEncoder

  1. Зачем шифровать пароли
  2. List of password encoders
  3. Implement password encode/decode in the app
  4. Тестирование функционала

lesson 105. Logout

  1. LogoutFilter source code
  2. Customise logout in SecurityFilterChain
  3. Add button Logout on pages
  4. Тестирование функционала

lesson 106. Authorization Architecture

  1. AuthorizationFilter source code and logic
  2. AuthorizationFilter implementations
  3. Customise authorizeHttpRequests in SecurityFilterChain
  4. Тестирование функционала

lesson 107. Method Security

  1. @PreAuthorize annotation
  2. @PostAuthorize annotation
  3. @EnableMethodSecurity annotation
  4. @Secured annotation
  5. Service layer authentication
  6. @PreFilter & @PostFilter annotations

lesson 108. Access to authenticated user

  1. Get current user via SecurityContextHolder
  2. @CurrentSecutiryContext annotation
  3. @AuthenticationPrincipal annotation
  4. Thymeleaf and Spring Security integration

lesson 109. CSRF Filter

  1. Cross-Site Request Forgery
  2. How to solve CSRF problem
  3. Synchronizer Token Pattern
  4. When to use CSRF protection
  5. CsrfFilter source code
  6. How to work with CSRF token
  7. Class CsrfRequestDataValueProcessor
  8. Тестирование функционала

lesson 110. Security Testing

  1. Исправление существующих тестов
  2. spring-security-test dependency
  3. 1. Manually define a user in tests
  4. 2. @WithMockUser annotation
  5. 3. SecurityMockMvcRequestPostProcessor

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

  1. Текущий Authentication функционал в приложении
  2. Что такое OAuth 2
  3. Как внедрить OAuth 2 в приложении
  4. OAuth 2 flow types
  5. OAuth 2 Authorization Code Flow
  6. OAuth 2 Implicit Flow
  7. OpenID Connect (OIDC)

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

  1. Create a new project in GCP
  2. Configure OAuth 2 in the project
  3. Configure Login Page
  4. Тестирование функционала

lesson 113. OAuth 2.0. Authentication Principle

  1. Add UserInfoEndpoint config in SecurityFilterChain
  2. Create oidcUserService
  3. Тестирование функционала

lesson 114. JWT. JSON Web Token

  1. How to extract info from JWT
  2. JWT header
  3. JWT payload
  4. JWT signature
  5. Code Book

lesson 115. Swagger Authorization

  1. 3 options to pass authorization in Swagger
  2. springdoc properties to support OAuth 2
  3. @SecurityScheme configuration
  4. Тестирование функционала

20. i18n & l10n

lesson 116. i18n. MessageSource

  1. spring.messages properties
  2. IntelliJ IDEA UTF-8 settings
  3. Creating MessageRestController
  4. Тестирование функционала

lesson 117. i18n. Thymeleaf

  1. Login page i18n
  2. How to change the language
  3. LocalChangeInterceptor bean
  4. LocaleResolver bean
  5. Тестирование функционала

21. AOP Starter

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

  1. Усложнение кода второстепенной логикой
  2. Crosscutting concerns
  3. AOP terminology
  4. AOP approaches

lesson 119. AOP. Pointcut

  1. spring-boot-starter-aop dependency
  2. AspectJ annotations
  3. @Pointcut
  4. @within
  5. within
  6. this & target
  7. @annotation
  8. args
  9. @args
  10. bean
  11. execution

lesson 120. AOP. @Before Advice

  1. @Before annotation
  2. Тестирование функционала
  3. CglibAopProxy
  4. Proxy interceptors
  5. Spring AOP diagram
  6. AopAutoConfiguration

lesson 121. AOP. JoinPoint. Params

  1. JoinPoint object
  2. Get access to proxy data from advice method params
  3. Тестирование функционала
  4. argNames

lesson 122. AOP. @After Advices

  1. All types of advice
  2. @AfterReturning annotation
  3. @AfterThrowing annotation
  4. @After annotation
  5. Тестирование функционала

lesson 123. AOP. @Around Advice

  1. TransactionInterceptor
  2. @Around annotation
  3. Тестирование функционала

lesson 124. AOP. Best Practices

  1. 1. Combine different Pointcut types
  2. 2. Move common Pointcuts to separate Aspect
  3. 3. Don t use @Around advice everywhere
  4. 4. Separate Pointcuts by business logic
  5. Aspects order

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

lesson 125. Custom Spring Boot Starter

  1. Create a new Gradle module
  2. Define starter properties
  3. Create Autoconfiguration
  4. File META-INF/spring.factories
  5. Move Aspects from the old to the new module
  6. How to use newly created starter
  7. spring-boot-configuration-processor
  8. Тестирование функционала

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

  1. Spring Framework Documentation
  2. List of all main Spring Boot Starters
  3. 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 можно увидеть в следующем коде:

@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 может выглядеть следующим образом:

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;
@Component
public class SimpleBean {
    public String hello() {
        return "Hello world!";
    }
}
  1. XML-конфигурация: Другим способом создания определений бинов в Spring Framework является использование XML-конфигурации. Это позволяет определять бины в XML-файлах. Например:
<bean id="simpleBean" class="com.example.SimpleBean">
    <property name="message" value="Hello world!" />
</bean>
  1. Java-конфигурация: Также возможно создавать определения бинов в Spring Framework с помощью 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-конфигурации может выглядеть следующим образом:

<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>

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

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

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

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:
<bean id="myBean" class="com.example.MyClass" />
<alias name="myAlias" alias="myBean" />

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

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

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

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

Start of Selection

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

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

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

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

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:
import org.springframework.beans.factory.annotation.Value;

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

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

  1. Внедрение примитивных типов данных с помощью @Autowired: Внедрение примитивных типов данных с использованием @Autowired может осуществляться через конструктор, сеттеры или поля. Например:
  • Внедрение через конструктор:
public class MyBean {
    private int myNumber;

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

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

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

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

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

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

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

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

    public CollectionExample(List<String> myList) {
        this.myList = myList;
    }
}
  • Пример внедрения множества (Set) с использованием конструктора:
public class CollectionExample {
    private Set<Integer> mySet;

    public CollectionExample(Set<Integer> mySet) {
        this.mySet = mySet;
    }
}

В обоих примерах Spring будет автоматически внедрять соответствующие коллекции при создании экземпляра класса CollectionExample.

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

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

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 может выглядеть следующим образом:

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 может выглядеть следующим образом:

public class MyBean {
    private String[] myArray;

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

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

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

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

public class MyBean {
    private List<String> myList;

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

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

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

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

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

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-конфигурации может выглядеть следующим образом:

<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.

Пример реализации может выглядеть следующим образом:

public interface CompanyRepository extends JpaRepository<Company, Long> {
    // Методы для доступа к данным
}

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

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

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

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

Пример реализации может выглядеть следующим образом:

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-конфигурации может выглядеть следующим образом:

<bean id="myBean" factory-bean="myFactoryBean" factory-method="createCar"/>

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

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

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

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

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

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

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

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

Пример реализации класса ConnectionPool с использованием методов set* может выглядеть следующим образом:

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-конфигурации следующим образом:

<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 контейнер инициализируется, он создает экземпляры бинов, определенных в конфигурации. Это может происходить при запуске приложения или по запросу.

    Пример:

    @Component
    public class MyBean {
        public MyBean() {
            System.out.println("Бин MyBean создан");
        }
    }
    
  2. Настройка бина: После создания бина Spring настраивает его свойства, используя значения, указанные в конфигурации. Это может включать внедрение зависимостей через конструкторы, сеттеры или аннотации.

    Пример:

    @Component
    public class MyService {
        private final MyRepository repository;
    
        @Autowired
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    }
    
  3. Инициализация бина: После настройки бина Spring может вызывать методы инициализации, если они определены. Это позволяет выполнять дополнительные действия, такие как открытие соединений или настройка ресурсов.

    Пример:

    @Component
    public class MyBean {
        @PostConstruct
        public void init() {
            System.out.println("Бин MyBean инициализирован");
        }
    }
    
  4. Использование бина: После инициализации бин готов к использованию. Он может быть запрошен другими компонентами или сервисами в приложении.

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

    Пример:

    @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. Неизменяемость: При использовании внедрения через конструктор зависимости передаются в объект при его создании, что делает объект неизменяемым после создания. Это особенно полезно для обеспечения целостности данных.

    Пример:

    @Component
    public class MyService {
        private final MyRepository repository;
    
        @Autowired
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    }
    
  2. Явность зависимостей: Все зависимости класса явно указаны в его конструкторе, что упрощает понимание того, какие зависимости необходимы для работы класса.

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

Минусы Constructor Injection:

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

    Пример:

    @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. Гибкость: Внедрение через свойства позволяет изменять зависимости после создания объекта, что может быть полезно в некоторых сценариях.

    Пример:

    @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.

public class BeanA {
    private BeanB beanB;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    @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. Создание класса пользовательской области видимости:
public class MyCustomScope implements Scope {
    // Реализация методов интерфейса Scope
}
  1. Реализация методов интерфейса Scope:
public class MyCustomScope implements Scope {
    // Реализация методов интерфейса Scope
}
  1. Зарегистрирование области видимости в контексте приложения:
// Регистрация области видимости в контексте приложения

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