Demystification de Spring
Une histoire de Pattern
Hervé Letourneur
12/12/2023
Présentation
1
2
Confidentiel Propriété Meritis
3
Présentation
Hervé Letourneur
Développeur Java depuis 15 ans
Responsable du centre de compétence Java
C’est quoi Spring ?
2
4
Confidentiel Propriété Meritis
C’est un framework qui facilite le développement
5
Réponse en Entretien
C’est
magique
C’est pour faire des applications web
C’est une implémentation Jakarta EE
Confidentiel Propriété Meritis
C’est un conteneur IoC : Inversion of Control
6
Qu’est ce que Spring-core au final ?
Code Applicatif
Librairie
Framework
Confidentiel Propriété Meritis
7
Quel type d’Inversion de contrôle ?
couplage fort
DAO
Service
Controller
Confidentiel Propriété Meritis
8
Quel type d’Inversion de contrôle ?
Dépendance et couplage faible
DAO
Service
Controller
Reutilisabilité
Testabilité
Modifiable
Confidentiel Propriété Meritis
9
Injection de dépendance
DAO
Service
Controller
Nous allons délégué à Spring la création des dépendances
On inverse le contrôle
FACTORY
Confidentiel Propriété Meritis
10
Application context est une Factory
Scan des dépendances à créer
Via @Qualifier (API)
Via @Service, @Component,
@Repository
Controller.class Service.class
Dao.class
Scan de la méthode
d’injection
Via @Inject (API)
Via @Autowired
(Privilégié par constructeur)
Utilisation de la réflexivité
pour créer les dépendances et
les référencer dans le contexte
via son type et son nom
Confidentiel Propriété Meritis
11
Type d’ApplicationContext
Confidentiel Propriété Meritis
Nos dépendances sont créées via Spring, on peut leur donner un Scope qui va définir leur cycle de
vie.
La factory va aussi scanné l’annotation @Scope afin de determiner le cycle de vie choisit.
12
Et si on déléguait plus de chose à Spring ?
Singleton
Une seule instance de la dépendance
sera créée et injecté à chaque demande
de dépendance.
Elle vivra tant que le contexte spring
vivra.
Prototype
Une seule sera créé à chaque demande
de dépendances.
Spring ne garde aucune référence à une
instance crée et ne gére donc pas son
cycle de vie.
WebAware
scope
Des scopes spécifiques au context web
dans les cycles de vies dépendent du
type de scope.
Par exemple le request scope créera
une instance qui ne vivra que le temps
de la requête
Confidentiel Propriété Meritis
Provider<T> ?
(API)
13
Et une autre Factory pour les scopes ?
ObjectFactory<T>
Confidentiel Propriété Meritis
Puisque l’on a un conteneur d’inversion de contrôle, pourquoi ne pas lui donner des taches
techniques et répétitives pour que l’on se concentre sur le métier ?
Ex : @Transactional
14
Encore plus de délégation à Spring ?
Spring begin Trans Spring end Trans
Code Applicatif
Code applicatif Code applicatif
Lib ou Api
Transaction
Comment Spring fait ?
Confidentiel Propriété Meritis
Proxy du Service
UN
PROXY
15
Spring au petit oignon !!
ApplicationContext
getBean(Service.class)
Service
Confidentiel Propriété Meritis
16
Voici ce que Spring nous crée !
DAO
Service
Controller
Confidentiel Propriété Meritis
Spring-core est un conteneur IoC :
Il va créer nos dépendances grâce à l’injection de dépendance.
Il va gérer leur cycle de vie.
Ces dépendances vont être proxyfié afin de faciliter l’ajout de fonctionnalité technique
17
Spring-core
Application à d’autres modules
3
18
Confidentiel Propriété Meritis
19
Spring Web
DispatcherServlet
Controller
Controller
http request
@RestController
@RequestMapping("/controller1")
@RestController
@RequestMapping("/controller2")
Request sur
/controller1
Request sur
/controller2
Service1 Etc …
Confidentiel Propriété Meritis
JdbcTemplate => Template de Méthode
20
Spring Jdbc
Template démarre la
session JDBC
Preparation du prepare
statement et execution
Code applicatif fournit la requête
et paramêtre
Récupération
ResultSet
Fin de la sessionretourne le
résultat du mapping
Code applicatif fournit le
rowmapper
Confidentiel Propriété Meritis
21
Spring Security
DispatcherServlet
Sécurité Chain => Chaine de resposabilité
CorsFilter
ExceptionTrans
altionfilter
JwtFilter AuthenticationFilter
Confidentiel Propriété Meritis
Spring Boot avec le principe d’auto-configuration pousse au maximum tout ce que le framework
prend en charge.
Dans le cas d’une application Web qui utilisera une base de donnée, il suffira de mettre les propriétés
(host, login, mdp) de la base de donnée, les controllers et les services métier.
Spring s’occupera de créer la DataSource à notre place, l’injecter dans nos Repository JPA qui eux
même recevront une implémentation fournit par Spring, il construira les dépendances juqu’aux
RestController qui seront référencer dans la DispatcherServlet qui elle-même sera déclaré dans un
conteneur de Servlet qui sera démarrer.
22
Sprint Boot
23

Demystification de Spring Une histoire de Pattern.pptx

  • 1.
    Demystification de Spring Unehistoire de Pattern Hervé Letourneur 12/12/2023
  • 2.
  • 3.
    Confidentiel Propriété Meritis 3 Présentation HervéLetourneur Développeur Java depuis 15 ans Responsable du centre de compétence Java
  • 4.
  • 5.
    Confidentiel Propriété Meritis C’estun framework qui facilite le développement 5 Réponse en Entretien C’est magique C’est pour faire des applications web C’est une implémentation Jakarta EE
  • 6.
    Confidentiel Propriété Meritis C’estun conteneur IoC : Inversion of Control 6 Qu’est ce que Spring-core au final ? Code Applicatif Librairie Framework
  • 7.
    Confidentiel Propriété Meritis 7 Queltype d’Inversion de contrôle ? couplage fort DAO Service Controller
  • 8.
    Confidentiel Propriété Meritis 8 Queltype d’Inversion de contrôle ? Dépendance et couplage faible DAO Service Controller Reutilisabilité Testabilité Modifiable
  • 9.
    Confidentiel Propriété Meritis 9 Injectionde dépendance DAO Service Controller Nous allons délégué à Spring la création des dépendances On inverse le contrôle FACTORY
  • 10.
    Confidentiel Propriété Meritis 10 Applicationcontext est une Factory Scan des dépendances à créer Via @Qualifier (API) Via @Service, @Component, @Repository Controller.class Service.class Dao.class Scan de la méthode d’injection Via @Inject (API) Via @Autowired (Privilégié par constructeur) Utilisation de la réflexivité pour créer les dépendances et les référencer dans le contexte via son type et son nom
  • 11.
  • 12.
    Confidentiel Propriété Meritis Nosdépendances sont créées via Spring, on peut leur donner un Scope qui va définir leur cycle de vie. La factory va aussi scanné l’annotation @Scope afin de determiner le cycle de vie choisit. 12 Et si on déléguait plus de chose à Spring ? Singleton Une seule instance de la dépendance sera créée et injecté à chaque demande de dépendance. Elle vivra tant que le contexte spring vivra. Prototype Une seule sera créé à chaque demande de dépendances. Spring ne garde aucune référence à une instance crée et ne gére donc pas son cycle de vie. WebAware scope Des scopes spécifiques au context web dans les cycles de vies dépendent du type de scope. Par exemple le request scope créera une instance qui ne vivra que le temps de la requête
  • 13.
    Confidentiel Propriété Meritis Provider<T>? (API) 13 Et une autre Factory pour les scopes ? ObjectFactory<T>
  • 14.
    Confidentiel Propriété Meritis Puisquel’on a un conteneur d’inversion de contrôle, pourquoi ne pas lui donner des taches techniques et répétitives pour que l’on se concentre sur le métier ? Ex : @Transactional 14 Encore plus de délégation à Spring ? Spring begin Trans Spring end Trans Code Applicatif Code applicatif Code applicatif Lib ou Api Transaction Comment Spring fait ?
  • 15.
    Confidentiel Propriété Meritis Proxydu Service UN PROXY 15 Spring au petit oignon !! ApplicationContext getBean(Service.class) Service
  • 16.
    Confidentiel Propriété Meritis 16 Voicice que Spring nous crée ! DAO Service Controller
  • 17.
    Confidentiel Propriété Meritis Spring-coreest un conteneur IoC : Il va créer nos dépendances grâce à l’injection de dépendance. Il va gérer leur cycle de vie. Ces dépendances vont être proxyfié afin de faciliter l’ajout de fonctionnalité technique 17 Spring-core
  • 18.
  • 19.
    Confidentiel Propriété Meritis 19 SpringWeb DispatcherServlet Controller Controller http request @RestController @RequestMapping("/controller1") @RestController @RequestMapping("/controller2") Request sur /controller1 Request sur /controller2 Service1 Etc …
  • 20.
    Confidentiel Propriété Meritis JdbcTemplate=> Template de Méthode 20 Spring Jdbc Template démarre la session JDBC Preparation du prepare statement et execution Code applicatif fournit la requête et paramêtre Récupération ResultSet Fin de la sessionretourne le résultat du mapping Code applicatif fournit le rowmapper
  • 21.
    Confidentiel Propriété Meritis 21 SpringSecurity DispatcherServlet Sécurité Chain => Chaine de resposabilité CorsFilter ExceptionTrans altionfilter JwtFilter AuthenticationFilter
  • 22.
    Confidentiel Propriété Meritis SpringBoot avec le principe d’auto-configuration pousse au maximum tout ce que le framework prend en charge. Dans le cas d’une application Web qui utilisera une base de donnée, il suffira de mettre les propriétés (host, login, mdp) de la base de donnée, les controllers et les services métier. Spring s’occupera de créer la DataSource à notre place, l’injecter dans nos Repository JPA qui eux même recevront une implémentation fournit par Spring, il construira les dépendances juqu’aux RestController qui seront référencer dans la DispatcherServlet qui elle-même sera déclaré dans un conteneur de Servlet qui sera démarrer. 22 Sprint Boot
  • 23.