спринг пекции. Spring для начинающих
Скачать 2.11 Mb.
|
zaurtregulov@gmail.com Spring для начинающих Для кого предназначен данный курс? • Для людей, совсем ничего не знающих о Spring и Hibernate • Для людей, которые хотят расширить знания о Spring и Hibernate и закрепить свои знания различными примерами Чем необходимо обладать для начала просмотра курса? • Базовыми знаниями языка программирования Java • ЖЕЛАНИЕМ изучить Spring, Hibernate и Spring Boot Простые объяснения Простые примеры Много практики Успешное обучение + + = Содержание курса IoC и DI AOP Hibernate Spring MVC Spring MVC + Hibernate + AOP Spring REST Spring Security Spring Boot Spring для начинающих • Уроки стали короткими • Уроки сохранили эффективность • Стало ещё больше примеров Спрашивайте и Помогайте Не забудьте оценить Spring Spring – это фреймворк, предназначенный для более быстрого и простого построения Java приложений Год создания: 2004 Последняя версия (на 27.10.2020) – Spring 5 Официальный сайт: www.spring.io Inversion of Control class Test1 Spring Container configuration file Предоставьте объект Pet Получите объект Dog Cat … Inversion of Control Основные функции, которые выполняет Spring Container: • IoC – инверсия управления Создание и управление объектами • DI – Dependency Injection Внедрение зависимостей IoC – аутсорсинг создания и управления объектами. Т.е. передача программистом прав на создание и управление объектами Spring-у. Inversion of Control Способы конфигурации Spring Container: • XML file (устаревший способ) • Annotations + XML file (современный способ) • Java code (современный способ) Inversion of Control Конфигурация XML файла: • id – идентификатор бина • class – полное имя класса Inversion of Control Spring Bean (или просто bean) – это объект, который создаётся и управляется Spring Container ApplicationContext представляет собой Spring Container. Поэтому для получения бина из Spring Container нам нужно создать ApplicationContext. Dependency Injection Employee Car House Pet Window Door Wall Dependency Injection Spring Container Employee Car House Pet Window Door Wall Dependency Injection DI – аутсорсинг добавления/внедрения зависимостей. DI делает объекты нашего приложения слабо зависимыми друг от друга. Способы внедрения зависимостей: • С помощью конструктора • С помощью сеттеров • Autowiring Dependency Injection DI с помощью конструктора: За кулисами: • constructor-arg – аргумент конструктора • ref – ссылка на bean id Dependency Injection DI с помощью сеттера: За кулисами: Первая буква в слове «pet» становится заглавной и в начало слова добавляется «set». После чего вызывается получившийся метод. Dependency Injection Внедрение строк и других значений: За кулисами: • value – значение, которое мы хотим присвоить. Dependency Injection Внедрение строк и других значений из properties файла: За кулисами: IoC & DI IoC – аутсорсинг создания и управления объектами. Т.е. передача программистом прав на создание и управление объектами Spring-у. DI – аутсорсинг добавления/внедрения зависимостей. DI делает объекты нашего приложения слабо зависимыми друг от друга. Большое количество программистов используют эти термины как взаимозаменяемые. Bean scope Scope (область видимости) определяет: • жизненный цикл бина • возможное количество создаваемых бинов Разновидности bean scope: singletone prototype request session global-session Bean scope singletone – дефолтный scope. • такой бин создаётся сразу после прочтения Spring Container-ом конфиг файла. • является общим для всех, кто запросит его у Spring Container-а. • подходит для stateless объектов. Dog Spring Container Bean scope prototype • такой бин создаётся только после обращения к Spring Container-у с помощью метода getBean. • для каждого такого обращения создаётся новый бин в Spring Container-е. • подходит для stateful объектов. Dog Spring Container Dog Жизненный цикл бина init-method Запуск приложения Начало работы Spring Container Создание бина DI – внедряются зависимости destroy-method Бин готов для использования Использование нами этого бина Конец работы Spring Container Остановка приложения Чаще всего init-method используется для открытия или настройки каких-либо ресурсов, например баз данных, стримов и т.д. destroy-method чаще всего используется для их закрытия. Методы init и destroy Методы init и destroy У данных методов access modifier может быть любым У данных методов return type может быть любым. Но из-за того, что возвращаемое значение мы никак не можем использовать, чаще всего return type – это void. Называться данные методы могут как угодно. В данных методах не должно быть параметров. Методы init и destroy Если у бина scope = prototype, то: • для этого бина destroy-method вызываться не будет • init-method будет вызываться для каждого новосозданного бина. • программисту необходимо самостоятельно писать код для закрытия/освобождения ресурсов, которые были использованы в бине Конфигурация с помощью аннотаций Аннотации – это специальные комментарии/метки/метаданные, которые нужны для передачи определённой информации. Конфигурация с помощью аннотаций более короткий и быстрый способ, чем конфигурация с помощью XML файла. Процесс состоит из 2-х этапов: 1. сканирование классов и поиск аннотации @Component 2. Создание (регистрация) бина в Spring Container-е Конфигурация с помощью аннотаций Конфигурация с помощью аннотаций Если к аннотации @Component не прописать bean id, то бину будет назначен дефолтный id. Дефолтный bean id получается из имени класса, заменяя его первую заглавную букву на прописную. cat favoriteSong SQLTest @Autowired Для внедрения зависимостей с помощью аннотаций используется аннотация @Autowired Типы autowiring-а или где мы можем использовать данный DI: • Конструктор • Сеттер • Поле @Autowired Процесс внедрения зависимостей при использовании @Autowired такой: 1. Сканирование пакета, поиск классов с аннотацией @Component 2. При наличии аннотации @Autowired начинается поиск подходящего по типу бина Далее ситуация развивается по одному из сценариев: Если находится 1 подходящий бин, происходит внедрение зависимости; Если подходящих по типу бинов нет, то выбрасывается исключение; Если подходящих по типу бинов больше одного, тоже выбрасывается исключение. @Autowired Constructor injection Setter injection Any method injection Field injection @Qualifier Если при использовании @Autowired подходящих по типу бинов больше одного, то выбрасывается исключение. Предотвратить выброс данного исключения можно конкретно указав, какой бин должен быть внедрён. Для этого и используют аннотацию @Qualifier. @Qualifier Field Setter Constructor @Value Для внедрения строк и других значений можно использовать аннотацию @Value. В этом случае в сеттерах нет необходимости, как это было при конфигурации с помощью XML файла. Hardcoded вариант Вариант с properties файлом Bean scope singletone – дефолтный scope. • такой бин создаётся сразу после прочтения Spring Container-ом конфиг файла. • является общим для всех, кто запросит его у Spring Container-а. • подходит для stateless объектов. prototype • такой бин создаётся только после обращения к Spring Container- у с помощью метода getBean. • для каждого такого обращения создаётся новый бин в Spring Container-е. • подходит для stateful объектов. Методы init и destroy У данных методов access modifier может быть любым У данных методов return type может быть любым. Но из-за того, что возвращаемое значение мы никак не можем использовать, чаще всего return type – это void. Называться данные методы могут как угодно. В данных методах не должно быть параметров. Методы init и destroy Если у бина scope = prototype, то: • для этого бина destroy-method вызываться не будет • init-method будет вызываться для каждого новосозданного бина. • программисту необходимо самостоятельно писать код для закрытия/освобождения ресурсов, которые были использованы в бине @PostConstruct и @PreDestroy Конфигурация Spring Container-а с помощью Java кода. Способ 1 При использовании конфигурации с помощью Java кода, Spring Container будет представлен классом AnnotationConfigApplicationContext Аннотация @Configuration означает, что данный класс является конфигурацией. С помощью аннотации @ComponentScan мы показываем, какой пакет нужно сканировать на наличие бинов и разных аннотаций. Конфигурация Spring Container-а с помощью Java кода. Способ 2 • Данный способ не использует сканирование пакета и поиск бинов. Здесь бины описываются в конфиг классе. • Данный способ не использует аннотацию @Autowired. Здесь зависимости прописываются вручную. • Название метода – это bean id. • Аннотация @Bean перехватывает все обращения к бину и регулирует его создание. Аннотация @PropertySource Аннотация @PropertySource указывает на property файл откуда мы можем использовать значения для полей Aspect Oriented Programming Method addBook(String bookName, int personId) Основная логика метода Логирование Проверка прав доступа Aspect Oriented Programming Основная логика метода Логирование Проверка прав доступа addBook Основная логика метода Логирование Проверка прав доступа removeBook Основная логика метода Логирование Проверка прав доступа getBook Li br ar y Основная логика метода Логирование Проверка прав доступа method1 Основная логика метода Логирование Проверка прав доступа method3 Основная логика метода Логирование Проверка прав доступа method2 clas s XY Z …………… … …………… …………… Aspect Oriented Programming Проблемы, с которыми мы сталкиваемся: • Переплетение бизнес-логики со служебным функционалом (Code tangling). Метод становится громоздким, и его основной функционал сразу не заметно. • Разбросанность служебного функционала по всему проекту (Code scattering). При необходимости что-то изменить в служебном функционале, мы должны будем делать изменения во всех классах. Aspect Oriented Programming AOP – парадигма программирования, основанная на идее разделения основного и служебного функционала. Служебный функционал записывается в Aspect-классы. В основе Aspect заключена сквозная логика (cross-cutting logic). Aspect Oriented Programming К сквозному функционалу относят: • Логирование • Проверка прав (security check) • Обработка транзакций • Обработка исключений • Кэширование • И т.д. Aspect Oriented Programming Метод для логирования Метод, проверяющий права доступа Aspect Вызов метода addBook Aspect Oriented Programming Вызов метода addBook Main класс метод addBook Library класс Aspect Oriented Programming Метод для логиро- вания Метод, проверя- ющий права доступа Вызов метода addBook Main класс метод addBook Library класс AOP Proxy Aspect Oriented Programming Плюсы AOP: • Сквозной функционал сосредоточен в 1-м или нескольких обособленных классах. Это позволяет легче его изменять. • Становится легче добавлять новые сквозные работы для нашего основного кода или имеющиеся сквозные работы для новых классов. Это достигается благодаря конфигурации аспектов. • Бизнес-код приложения избавляется от сквозного кода, становится меньше и чище. Работать с ним становится легче Aspect Oriented Programming Минус AOP: • Дополнительное время на работу аспектов Aspect Oriented Programming AOP frameworks Spring AOP AspectJ Предоставляет самую распространённую и необходимую функциональность AOP Более сложный в использовании Простой в использовании Предоставляет всю функциональность AOP Aspect Oriented Programming Метод для логирования Вызов метода getBook Test1 класс метод getBook Library класс AOP Proxy Aspect @EnableAspectJAutoProxy позволяет нам за кулисами использовать Spring AOP Proxy @Aspect говорит о том, что это не простой класс, а Aspect. Поэтому к данному классу Spring будет относиться по другому. Aspect – это класс, отвечающий за сквозную функциональность. Advice Типы • Before – выполняется до метода с основной логикой • After returning – выполняется только после нормального окончания метода с основной логикой • After throwing – выполняется после окончания метода с основной логикой только, если было выброшено исключение • After/ After finally – выполняется после окончания метода с основной логикой • Around – выполняется до и после метода с основной логикой Advice и Pointcut Advice – метод, который находится в Aspect-е и содержит сквозную логику. Advice определяет, что и когда должно происходить. В идеале Advice должен быть небольшим и быстро работающим. Pointcut – выражение, описывающее где должен быть применён Advice. Pointcut Pointcut – выражение, описывающее где должен быть применён Advice. Spring AOP использует AspectJ Pointcut expression language. Т.е. определённые правила в написании выражений для создания Pointcut execution( modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(parameters-pattern) throws-pattern? ) Pointcut Соответствует методу без параметров, где бы он ни находился с access modifier = public, return type = void и именем = getBook Соответствует методу без параметров, из класса UnivercityLibrary с access modifier = public, return type = void и именем = getBook Соответствует методу без параметров, где бы он ни находился с access modifier = public, return type = void и именем, начинающимся на «get» Соответствует методу без параметров, где бы он ни находился с любым access modifier, любым return type и именем = getBook Соответствует методу без параметров, где бы он ни находился с любым access modifier, любым return type и любым именем Pointcut Соответствует методу с параметром String, где бы он ни находился с access modifier = public, return type = void и именем = getBook Соответствует методу с любым одним параметром, где бы он ни находился с access modifier = public, return type = void и именем = getBook Соответствует методу с любым количеством любого типа параметров, где бы он ни находился с access modifier = public, return type = void и именем = getBook Pointcut Соответствует методу с любым количеством любого типа параметров, где бы он ни находился с любым access modifier, любым return type и любым именем Соответствует методу, первым параметром которого является aop.Book, а дальше может идти 0 и больше параметров любого типа, где бы этот метод ни находился с access modifier = public, return type = void и именем = getBook Объявление Pointcut Для того, чтобы не пользоваться copy-paste когда для нескольких Advice-ов подходит один и тот же Pointcut, есть возможность объявить данный Pointcut и затем использовать его несколько раз. @Pointcut(“pointcut_expression”) private void pointcut_reference() {} @Before(“pointcut_reference() ”) public void advice_name() { some code } Объявление Pointcut Плюсы объявления Pointcut: • Возможность использования созданного Pointcut для множества Advice-ов • Возможность быстрого изменения Pointcut expression для множества Advice-ов • Возможность комбинирования Pointcut-ов Комбинирование Pointcut-ов Комбинирование Pointcut-ов – это их объединение с помощью логических операторов && || ! Порядок выполнения Aspect-ов Если при вызове 1-го метода с бизнес-логикой срабатывают несколько Advice-ов, то нет никакой гарантии в порядке выполнения этих Advice-ов. Для соблюдения порядка такие Advice-ы нужно распределять по отдельным упорядоченным Aspect-ам. @Order(3) упорядочивает Aspect-ы. Чем меньше число, тем выше приоритет. Join Point Joint Point – это точка/момент в выполняемой программе когда следует применять Advice. Т.е. это точка переплетения метода с бизнес-логикой и метода со служебным функционалом. Прописав Joint Point в параметре метода Advice, мы получаем доступ к информации о сигнатуре и параметрах метода с бизнес- логикой. |