2.69M
Category: programmingprogramming

Spring Core

1.

2.

Что такое Spring
Spring один из самых популярных фреймворков для J2EE. Разработчики
по всему миру используют Spring для создания надёжных и качественных
приложений.
Spring Framework — это платформа Java, которая обеспечивает
комплексную поддержку инфраструктуры для разработки Javaприложений. Spring управляет инфраструктурой, чтобы вы могли
сосредоточиться на своем приложении.

3.

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

4.

IoC и DI
1. Инверсия управления — абстрактный принцип, постулирующий факт
задания потока выполнения некой внешней по отношению к вам сущностью.
2. Dependency Inversion – Тоже самое, что и в SOLID
3. Dependency Injection – один из видов инверсии управления. Это процесс
внедрения одного объекта в другой.
При написании действительно крупных и сложных проектов разработчики
сталкиваются с необходимостью делать классы приложения как можно более
независимыми друг от друга для возможности повторного использования и
юнит-тестирования.
Именно внедрение зависимостей устанавливает связи между этими
классами, при этом сохраняя их независимость друг от друга.

5.

IoC и DI
Инверсия управления в заключается в том, что мы передаем ряд ответственностей Spring контейнеру:
1.
Конфигурирование объектов.
2.
Инициализация объектов.
3.
Внедрение одних объектов в другие (Dependency injection)
4.
Управление жизненным циклом объектов.

6.

Поднятие контекста

7.

Конфигурация
Есть 3 основных вида конфигурации:
1. Xml – конфигурация прописывается в xml файлах.
2. Java – Создание бинов происходит посредством java кода.
3. Аннотации – Классы на основе, которых будут созданы бины аннотируются
stereotype аннотациями.
К следующему занятию знать все виды stereotype аннотаций, а также преимущества и
недостатки каждого из подходов конфигурации.

8.

Конфигурация
Java POJO классы поступают в Spring
Container, который на основании
конфигурации, выдаёт приложение,
готовое к использованию.

9.

BeanDefinition
Хранит множество важных метаданных, необходимых для создания бина:
1. name – уникальное имя бина, служит идентификатором.
2. class – Полное имя класса, на основе которого должен быть создан.
3. Аргументы конструктора.
4. LazyInit – определяет, нужно ли создавать бин лениво.
5. factoryBeanName и factoryMethodName.
6. Scope.
7. Init/destroy методы.

10.

Контейнер
В Spring есть 2 основных вида контейнеров:
1. BeanFactory – предоставляет базовый IoC & DI функционал.
2. ApplicationContext – помимо базового IoC & DI добавляет EE специфичные возможности.
Feature
BeanFactory
ApplicationContext
Bean instantiation/wiring
Yes
Yes
Integrated lifecycle management
No
Yes
Automatic BeanPostProcessor registr No
ation
Yes
Automatic BeanFactoryPostProcessor
registration
No
Yes
Convenient MessageSource access
(for internationalization)
No
Yes
Built-in ApplicationEvent publication
mechanism
No
Yes

11.

Вопрос на 1 балл
Как будут созданы бины лениво или при старте?

12.

Ответ
Зависит от того, какой тип контейнера вы используете.
• BeanFactory создает бины по необходимости (лениво).
• ApllicationContext создает бины при старте приложения (если scope singleton).

13.

Реализации ApplicationContext Container
Чаще всего используются следующие реализации AppicationContext:
• FileSystemXmlApplicationContext - загружает данные о бине из XML файла. При
использовании этой реализации в конструкторе необходимо указать полный
адрес конфигурационного файла.
• ClassPathXmlApplicationContext - этот контейнер также получает данные о бине
из XML файла. Но в отличие от FileSystemApplicationContext, в этом случае
необходимо указать относительный адрес конфигурационного файла
(CLASSPATH).
• WebXmlApplicationContext - эта реализация ApplicationContext получает
необходимую информацию из веб-приложения.

14.

BeanFactoryPostProcessor
Если класс помечен
аннотацией DeprecatedClass с
указанием на новую версию,
то beanCalssName в
BeanDefinition будет изменен
на newImpl класс из
DeprecatedClass.

15.

BeanPostProcessor
Создаем
собственную
аннотацию, если
класс
аннотирован ею,
то при вызове
методов будет
замерено время
работы и
выведено в
консоль.

16.

Поднятие контекста

17.

Spring Потрошитель
https://www.youtube.com/watch?v=BmBr5diz8WA&list=PL6yLoZ_3Y0HKGL3F7vv2SNSrA3TkbXtBX&index=2 1 часть
https://www.youtube.com/watch?v=cou_qomYLNU&list=PL6yLoZ_3Y0HKGL3F7vv2SNSrA3TkbXtBX&index=3 2 часть
На следующем занятии спрошу рандомного человека про 3-х фазный конструктор, если кто-то не ответит -1
балл.

18.

Scope
Spring поддерживает 6 видов scope, 4 из которых доступны в web версиях ApplicationContext.
1.
Singleton scope – Бин с такой областью видимости будет создан в единственном экземпляре в контейнере при
поднятии контекста. Является scope по умолчанию.
2.
Prototype scope – Каждый раз создается новый инстанс объекта. Т.е. при каждом запросе к контейнеру на
получение prototype бина будет создаваться новый объект.
Web specific scopes:
1.
Request scope – Бин с такой видимостью будет создаваться заново на каждый HTTP запрос. Т.е. жизненный
цикл бина привязан к жизненному циклу запроса. Такой бин является атрибутом объекта Request.
2.
Session scope – Жизненый цикл такого бина привязывается к объекту HTTP Session. Такой бин является
атрибутом объекта Session.
3.
Application scope – Бин с такой видимостью будет создан один раз для веб приложения. От singleton
отличается тем, что является синглтоном для веб приложения, а не контейнера. В рамках одного
ApplicationContext может быть несколько веб приложений. Такой бин является атрибутом объекта
ServletContext.

19.

Проблема зависимости бинов с разными scope
Возможна ситуация, когда один бин зависит от другого, при этом у них разные жизненные
циклы. На пример singleton бин А зависит от prototype бина В.

20.

Aware интерфейсы
Spring предоставляет ряд Aware интерфейсов, которые позволяют получить доступ к инфраструктуре. Один из таких
интерфейсов – ApplicationContextAware.

21.

Вопрос на 0.5 балла
Какие еще есть Aware интерфейсы?

22.

@Lookup
Суть в том, что мы создаем метод-заглушку в
бине Car и помечаете его специальным
образом – аннотацией @Lookup.
Этот метод должен возвращать бин Passenger,
каждый раз новый.
Контейнер Spring под капотом создаст прокси и
переопределит этот метод и будет вам
выдавать новый экземпляр бина Passenger при
каждом вызове аннотированного метода. Даже
если в вашей заглушке он возвращает null.

23.

Java config
Данный подход применим, если мы
используем java конфигурацию.

24.

Жизненный цикл бинов
Spring позволяет определить init/destroy методы для бинов, сделать это можно несколькими способами:
1. @PostConstruct и @PreDestroy
2. Так же есть интерфейсы LifeCycle и SmartLifeCycle – читаем сами!
3. InitializingBean, DisposableBean

25.

Связывание и @Autowired
Процесс внедрения зависимостей в бины при инициализации называется Spring Bean Wiring.
Считается хорошей практикой задавать явные связи между зависимостями, но в Spring
предусмотрен дополнительный механизм связывания @Autowired. Аннотация может
использоваться над конструктор, поле, сеттер-метод или метод конфигурации для связывания по
типу. Если в контейнере не будет обнаружен необходимый для вставки бин, то будет выброшено
исключение, либо можно указать @Autowired(required = false), означающее, что внедрение
зависимости в данном месте не обязательно.
Типы связывания:
autowire byName,
autowire byType,
autowire by constructor,
autowiring by @Autowired and @Qualifier annotations
Начиная со Spring Framework 4.3, аннотация @Autowired для конструктора больше не требуется,
если целевой компонент определяет только один конструктор. Однако, если доступно несколько
конструкторов и нет основного/стандартного конструктора, по крайней мере один из конструкторов
должен быть аннотирован @Autowired, чтобы указать контейнеру, какой из них использовать.

26.

АОП
АОП — аспектно-ориентированное программирование — это парадигма, направленная
на повышение модульности различных частей приложения за счет разделения сквозных
задач. Для этого к уже существующему коду добавляется дополнительное поведение,
без изменений в изначальном коде. Иными словами, мы как бы навешиваем сверху на
методы и классы дополнительную функциональность, не внося поправки в
модифицируемый код.
Примерами сквозных задач могут служить:
1.
Логирование
2.
Транзакционность
3.
Политика безопасности

27.

Основные понятия АОП
Совет (Advice) - Это фактическое действие, которое должно быть предпринято до и/или после выполнения метода.
Это конкретный код, который вызывается во время выполнения программы.
Точка соединения (Join point) - Это такая точка в приложении, где мы можем подключить аспект. Другими
словами, это место, где мы можем внедрить дополнительную логику (advice).
Аспект (Aspect) – модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение
остального кода, применяя совет в точках соединения, определенных некоторым срезом. Иными словами, это
комбинация советов и точек соединения. К примеру, модуль логирования будет вызывать АОП аспект для
логирования.

28.

АОП
Совет (Advice) может быть выполнен на разных этапах выполнения точки соединения (joint point):
before - Запускает совет перед выполнением метода.
after - Запускает совет после выполнения метода, независимо от результата его работы (кроме случая
остановки работы JVM).
after-returning - Запускает совет после выполнения метода, только в случае его успешного выполнения.
after-throwing - Запускает совет после выполнения метода, только в случае, когда этот метод “бросает”
исключение.
around - Запускает совет до и после выполнения метода. При этом инпоинты видят только начало и конец
метода. Например, если метод выполняет транзакцию и где-то в середине кода try/catch поймал exception,
транзакция все равно будет свершена, rollback не произойдет. В этом случае нужно пробрасывать ошибку за
пределы метода.
Срез точек (Pointcut) - Срезом называется несколько объединённых точек (join points), в котором должен быть
выполнен совет.
Введение (Introduction) - Это сущность, которая помогает нам добавлять новые атрибуты и/или методы в уже
существующие классы.
Целевой объект (Target object) - Это объект на который направлены один или несколько аспектов.
Плетение (Weaving) - Это процесс связывания аспектов с другими объектами приложения для создания совета.
Может быть вызван во время компиляции, загрузки или выполнения приложения.
English     Русский Rules