Dependencies injection
Зависимости
А в коде?
Способы разрешения зависимостей
Inversion of Control (IoC)
IoC(DI)-контейнер
Ближе к Spring Boot
Bean
И как они управляются?
И как их создавать?
@Configuration и @Bean
@Component
Но ведь было ещё 3?
И как это всё внедрять?
Field Injection
Setter Injection
Constructor Injection
Configuration bean
Циклические зависимости
Bean Scopes
Спасибо за внимание!
1.43M
Категория: ПрограммированиеПрограммирование

3. Dependencies Injections

1. Dependencies injection

Всё, что вы хотели узнать, но боялись

2. Зависимости

Зависимости возникают, когда компонент A
программы нуждается в других компонентах
(B, C, D…) для того, чтобы выполнять свою
работу
В таких случаях, компоненты B, C, D…
называются зависимостями компонента A (A
зависит от B, C, D)
A
B
C
D

3. А в коде?

4. Способы разрешения зависимостей

● Создание зависимостей в зависимом классе
● Внедрение зависимостей в пользовательском классе
● Ответственность за обработку зависимостей
возлагается на третью сторону (IoC)

5. Inversion of Control (IoC)

IoC – принцип объектно-ориентированного программирования, используемый
для уменьшения связанности в программе
Основная идея: предоставить управление нашим кодом третьей стороне
(фреймворку)
Мы можем достичь Inversion of Control с помощью:
➔ Strategy design pattern
➔ Service Locator pattern
➔ Factory pattern
➔ Dependency Injection (DI)

6. IoC(DI)-контейнер

IoC(DI)-контейнер – фреймворк (или часть фреймворка), который берет
ответственность за создание и предоставление объектов и,
следовательно, за разрешение их зависимостей

7. Ближе к Spring Boot

8.

9. Bean

Bean – объект, который управляется
Spring-ом и существует внутри его DIконтейнера
Бином является почти все в Spring —
сервисы, контроллеры, репозитории и
т.п.
Все приложение состоит из набора
бинов. Их можно регистрировать,
получать в качестве зависимостей,
проксировать, мокать и т.д.

10. И как они управляются?

@PostContruct
вызывается
где-то тут
Выполнение метода
afterPropertiesSet,
если бин реализует
интерфейс
InitializingBean
@PreDestroy
вызывается
где-то здесь
Выполнение метода
destroy, если бин
реализует
интерфейс
DisposableBean
Метод init будет вызван
здесь, если
@Bean(initMethod="init")
Метод destroyBean будет вызван здесь,
если @Bean(destroyMethod ="destroyBean")

11. И как их создавать?

1. @Configuration и @Bean
2. @Component
1. @Repository
2. @Service
3. @Controller

12. @Configuration и @Bean

@Configuration – аннотация говорит Spring Boot, что в данном классе происходит
создание бинов.
@Bean – аннотация используется для указания того, что в аннотированном
методе происходит создание бина

13. @Component

@Component – базовая аннотация для определения бина

14. Но ведь было ещё 3?

@Repository - помечается класс, который отвечает за работу с хранилищами
данных. Как правило, используется для работы с БД. Классы с такой аннотацией
имеют дополнительную обработку ошибок, связанных с работой БД
@Service - ничем не отличается от @Component. Документация Spring
рекомендует использовать именно эту аннотацию для классов, в которых
находится бизнес логика
@Controller - помечается класс, отвечающий за обработку http запросов. В таком
классе можно создавать обработчики для разных запросов

15. И как это всё внедрять?

У внедрения три пути:
● Field Injection
● Setter Injection
● Constructor Injection

16. Field Injection

17. Setter Injection

18. Constructor Injection

19. Configuration bean

20. Циклические зависимости

При внедрении через конструктор могут
возникать циклические зависимости
A
Разрешить их можно, заменив внедрение
через конструктор на внедрение через
сеттер, или с помощью аннотации @Lazy
B

21. Bean Scopes

@Scope(scopeName = "singleton")
Последняя версия Spring framework определяет 6 типов “областей” (scopes):
singleton (один и тот же экземпляр в рамках всего приложения, используется по
умолчанию)
prototype (новый экземпляр создается каждый раз, когда объект запрашивается у
контейнера)
Существующие только для веб-приложений:
request (новый экземпляр для каждого нового запроса, @RequestScope)
session (один и тот же экземпляр в рамках одной и той же сессии, @SessionScope)
application (один и тот же экземпляр для одного ServletContext, @ApplicationScope)
websocket (один и тот же экземпляр в рамках одной и той же WebSocket сессии)

22. Спасибо за внимание!

Спасибо
за внимание!
English     Русский Правила