SlideShare une entreprise Scribd logo
Démystification de Spring
Une Histoire de Pattern
Donnez-moi une définition simple ?
C’est un Framework C’est magique
C’est pour faire des application web
C’est pour faciliter le développement
Hervé
Letourneur
Développeur Java depuis 16 ans
Practice Leader
Un peu d’histoire !
Les premières lignes de code de Spring : fin 2002
Winter Spring
https://spring.io/blog/2006/11/09/spring-framework-the-origins-of-a-project-and-a-name
Rod Johnson publie un livre sur J2EE
Une définition simple :
Une définition simple :
Un conteneur IOC
Inversion de Contrôle
Inversion de Contrôle
Code Applicatif
Librairie Librairie Librairie
Framework
Code
Applicatif
Code
Applicatif
Code
Applicatif
Inversion de Contrôle
Principe d’Hollywood
« Ne nous appelez pas, c'est nous qui vous appellerons »
https://martinfowler.com/bliki/InversionOfControl.html
Inversion de Contrôle
Comment Spring fait ?
Injection de dépendance
Inversion de Dépendance
Inversion des dépendances (Dependency inversion principle)
il faut dépendre des abstractions, pas des implémentations. Cela
favorise la modularité, la flexibilité et la réutilisabilité en réduisant
les dépendances directes entre les modules.
public class Controller {
private final Service service;
public Controller(DataSource
dataSource) {
this.service = new
Service(dataSource);
}
}
public class Controller {
private final IService service;
public Controller(IService service) {
this.service = service;
}
}
Service
(code métier)
Controller
(Web)
Port
(Dao)
public class Controller {
private final IService service;
public Controller(IService service)
{
this.service = service;
}
}
public class Service implements IService
{
private final IPort port;
public Service(IPort port) {
this.port = port;
}
}
public class Dao implements IPort {
private final DataSource dataSource;
public Dao(DataSource dataSource) {
this.dataSource = dataSource;
}
}
public class Application {
public static void main(String[] args) {
DataSource dataSource = new DataSource();
IPort port = new Dao(dataSource);
IService service = new Service(port);
Controller controller = new Controller(service);
}
}
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);
Controller controller = applicationContext.getBean(Controller.class);
}
}
On inverse le contrôle
L’injection de dépendance
Premier Design Pattern
ApplicationContext
FACTORY
Comment le contexte crée nos composants ?
Scan des
définitions
- Annotation
- Classe de configuration
- XMLConfiguration
Création des
Composants
Via la Réflexivité
Selon le mode d’injection
- Constructeur
- Setter
Référencement
des
dépendances
Dictionnaire (Map)
associant le composant
à son nom et type
ServiceLocator
- Fields
Démystification de Spring une histoire de pattern
Factory
Réflexivité ServiceLocator
Injection de dépendance
Et si on déléguait plus ?
Cycle de vie de nos composants
Scope
Singleton Prototype
ObjectFactory<T
>
Web
Factory
Réflexivité ServiceLocator
Injection de dépendance
Factory
Réflexivité ServiceLocator
Injection de dépendance Cycle de vie
Singleton
Prototype
Scope
Framework
Code
Applicatif
Code
Applicatif
Code
Applicatif
AOP
Programmation Orienté Aspect
Exemple : Aspect Transactionnel
@Transactional
public String sayHello() {
return port.findHowToSayHello();
}
Proxy Decorator
Comment Spring crée ses proxys ?
CGLIB
(Class based)
JDK Dynamic Proxy
(Interface based)
Spring-AOP
Importance de l’inversion de dépendance
public class Controller {
private final Service service;
public Controller(DataSource
dataSource) {
this.service = new
Service(dataSource);
}
}
public class Controller {
private final IService service;
public Controller(IService service) {
this.service = service;
}
}
@Transactional
@Loggable
@Cacheable
public String sayHello() {
return port.findHowToSayHello();
}
Service
Proxy
Loggable
Cacheable
Transactionnal
Chaine de
Responsabilité
Service
(code métier)
Service
(code métier)
Controller
(Web)
Port
(Dao)
Framework
Code
Applicatif
Code
Applicatif
Code
Applicatif
Factory
Réflexivité ServiceLocator
Injection de dépendance Cycle de vie
Singleton
Prototype
Scope
Factory
Réflexivité ServiceLocator
Injection de dépendance Cycle de vie
Singleton
Prototype
Scope
AOP
Proxy
Décorator
Chaine de
Responsabilité
DispatcherServlet
DispatcherServlet
Web.xml
ContextLoaderListener
Service
(code
métier)
Controller
(Web)
Port
(Dao)
Service
(code
métier)
Controller
(Web)
Port
(Dao)
Service
(code
métier)
Controller
(Web)
Port
(Dao)
JDBC
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bdd", "USER", "1234");
PreparedStatement pstmt = conn.prepareStatement("SELECT id, email from user where name = ?"))
{
pstmt.setString(1, name);
try (ResultSet rs = pstmt.executeQuery()) {
List<User> users = new ArrayList<>();
while (rs.next()) {
int id = rs.getInt("id");
String email = rs.getString("email");
users.add(new User(id, name, email));
}
return users;
}
}
}
Requête
Paramètre
Connection
Mapper
ResultSet
PrepareStatement
Exécution requête
Itération sur le RS
Mapping entité
Fermeture ressource
JdbcTemplate
Template de Méthode
@Override
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws
DataAccessException {
return result(query(sql, args, new RowMapperResultSetExtractor<>(rowMapper)));
}
Factory
Réflexivité ServiceLocator
Injection de dépendance Cycle de vie
Singleton
Prototype
Scope
AOP
Proxy
Décorator
Chaine de
Responsabilité
Factory
Réflexivité ServiceLocator
Injection de dépendance Cycle de vie
Singleton
Prototype
Scope
AOP
Proxy
Décorator
Chaine de
Responsabilité
Web
DispatcherServlet
BDD
Template de Méthode
L’été de Spring
Conteneur perçu comme léger et simple
Standard dans les projets Java
Spring-Security
CorsFilter ExceptionFilter JwtFilter
Authentication
Filter
Security Chain
Spring-data-Jpa
public interface UserRepository extends JpaRepository<User, String> {
List<User> findByName(String name);
}
Convention over Configuration
public List<User> findUserByName(String name) {
return entityManager.createQuery("SELECT u FROM User u WHERE u.name = :name",
User.class)
.setParameter("name", name)
.getResultList();
}
Galaxie Spring
Winter is coming
Web.xml
Dispatcher
ContextLoader
Configurer
La
datasource
Configurer la
plateforme
de
transaction
Activer
l’AOP
Définir les
templatesConfigurer le
routing dans la
DispatcherServlet
Et plein d’autres
définitions dépendantes
des modules utilisés
Spring security Spring web
Spring core
Y.Y.Y-2 Y.X.Z-3
2014 : Spring-Boot
Auto-Configuration
DispatcherServlet
Web.xml
ContextLoaderListener
Service
(code
métier)
Controller
(Web)
Port
(Dao)
Service
(code
métier)
Controller
(Web)
Port
(Dao)
Service
(code
métier)
Controller
(Web)
Port
(Dao)
Activation des proxys pour
les transactions
Création des datasources
Et des Templates
Configuration de
la dispatcher
Déclaration de la
DispatcherServlet
Démarrage d’un conteneur Web
et du contexte Spring associé
Auto-Configuration
Creation du concept de Starter
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
Gestion des dépendances
Auto-Configuration
Basé sur les @Conditional
L’été de Spring-Boot
Perçu comme plus simple à utiliser
Standard dans les projets Java
Rapidité de démarrage d’un projet
Architectures MicroServices
Winter is coming back again ?
Démarrage de l’ordre de la seconde
Empreinte mémoire importante
Quel sera le prochain renouveau ?
Spring Boot avec GraalVM
Quarkus
Frameworkless
Merci !

Contenu connexe

PPT
Alt.net spring.net
PPT
Alt.net spring.net
PPSX
5 android web_service
PPTX
Workshop Spring - Session 1 - L'offre Spring et les bases
PPT
Linq et Entity framework
PPTX
Aspnetcore introduction
PPT
ASP.NET Futures
Alt.net spring.net
Alt.net spring.net
5 android web_service
Workshop Spring - Session 1 - L'offre Spring et les bases
Linq et Entity framework
Aspnetcore introduction
ASP.NET Futures

Similaire à Démystification de Spring une histoire de pattern (20)

PPT
Asp.Net Futures
PDF
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
PPT
Spring MVC
PDF
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
PPTX
react-slides.ppx (2) (1).pptx react presentation basic
PDF
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
PPTX
Développer sereinement avec Node.js
PPTX
JSTLcourensatangerpourlesetudiantsdu2emeanneeecole.pptx
PDF
Introduction à Angularjs
PPTX
Chapitre 01- Maitriser architecture micro-services avec Spring Boot et Spring...
PDF
Architecture jee principe de inversion de controle et injection des dependances
PPT
Dynamic Languages
PPTX
Web dev open door
PDF
Cours_ASP_NET_MVC_Premiers_pas.pdfTESTPAR
PPTX
cours Angular Http pour debutants en informatique.pptx
PPTX
cours Angular Httpdhdhhnscnnnxnbcbbb.pptx
PPTX
Linq Tech Days08 Lux
PDF
Middleware CORBA, mode de fonctionnement et utilisation.pdf
PPT
Java Database Connectivity
PDF
Android-Tp5 : web services
Asp.Net Futures
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Spring MVC
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
react-slides.ppx (2) (1).pptx react presentation basic
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
Développer sereinement avec Node.js
JSTLcourensatangerpourlesetudiantsdu2emeanneeecole.pptx
Introduction à Angularjs
Chapitre 01- Maitriser architecture micro-services avec Spring Boot et Spring...
Architecture jee principe de inversion de controle et injection des dependances
Dynamic Languages
Web dev open door
Cours_ASP_NET_MVC_Premiers_pas.pdfTESTPAR
cours Angular Http pour debutants en informatique.pptx
cours Angular Httpdhdhhnscnnnxnbcbbb.pptx
Linq Tech Days08 Lux
Middleware CORBA, mode de fonctionnement et utilisation.pdf
Java Database Connectivity
Android-Tp5 : web services
Publicité

Démystification de Spring une histoire de pattern

Notes de l'éditeur

  • #2: Alors aujourd’hui, on va parler de Spring d’où il vient comment il a été fait et où il va.
  • #3: 1- C’est un Framework : Oui mais en quoi ? 2- C’est pour faciliter le développement ? Peut-être à condition de bien connaitre le framework et son fonctionnement 3- C’est pour faire une application Web ? On peut mais pas que et surtout ce n’est pas la base du framework 4- C’est magique ? Ou la fameuse boite noire. Dans l’informatique, rien n’est magique, il faut connaitre le truc. 5- Intéressante réponse, développons 
  • #5: Rod Johnson publie un livre de 750 pages en 2002 pour essayer de demystifier J2EE qui était perçu par la communauté comme une API lourde, complexe, difficile à mettre en place et qui globalement ralentit les temps de développement. 1- En même temps que la publication de ce livre, il met à disposition 30k de ligne de codes d’un Framework appelé Spring. Ce framework est présenté comme étant une alternative légère à J2EE. 2- Mais au final pourquoi Spring ? J2EE était perçu complexe et lourde … 3- … Spring est arrivé comme une alternative simple et légère. 4- C’est un renouveau comme le passage de l’hiver au printemps Sur le site de Spring, vous pourrez trouver un article de Rod qui explique toute cette genèse.
  • #6: Revenons à la première question : Une définition Simple ? Comme on a dit au-dessus, c’est entre l’hiver et l’été … Bon on a vu pourquoi cette réponse pouvait être une référence à l’histoire de Spring et donc une réponse intéressante pour initier une discussion. Mais on n'a toujours pas expliqué ce que Spring avait apporter pour simplifier notre quotidien à l’époque … et on n’a pas encore parler d’été non plus on verra ça plus tard
  • #7: Une définition simple pourrait être : Conteneur IOC. IOC pour Inversion de Contrôle qui est patron d’architecture Littéralement, on pourrait simplement dire que le Framework va prendre le contrôle sur quelque chose qui était avant à la main du développeur.
  • #8: 1- Si on prend une application sans framework, le flot d’exécution est contrôlé par le code applicatif écrit par le developpeur. Ce flot d’exécution fera appel à des fonctions de librairie pour faire certains traitements techniques. 2- Une application construite avec un framework, c’est le contraire qui va se passer. Nous allons définir des comportement, flux d’exécution métier que nous allons pluggué dans le framework. Le framework va ensuite contrôlé le flux d’exécution et appelé notre code applicatif.
  • #9: On pourrait résumé ce que je viens de dire par le Principe d’Hollywood !
  • #10: Si vous souhaitez en lire plus, je ne peux que vous conseilliez de lire l’article de Martin Fowler sur l’IOC … lui va bientôt avoir 20 ans.
  • #11: Alors mais comment Spring fait l’inversion de contrôle pour cela on va parler de deux autres concepts : L’inversion de dépendance et L’injection de dépendance ! 1- L’inversion de dépendance ce n’est pas la fusion d’inversion de contrôle et injection de dépendance :D
  • #12: L’inversion de dépendance selon wikipédia 1- Si on grossit le trait, on ne veut pas de ça … 2- Mais plutôt d’un Controller qui a une dépendance, ici un service respectant une interface, qu’on lui donne à l’instanciation On peut changer d’implémentation de service sans impacter le Controller. Il connait le contrat de service et c’est suffisant pour faire ce qu’il a à faire. Cela nous permet d’avoir un couplage faible entre les composants de notre application.
  • #13: Ici juste parler de la construction basique d’une application, Les controller qui gére les demandes extérieures, le service qui faire le code métier, et les Ports qui permettent au code métier d’appeler l’extérieurs. Chaque couche respectant les codes de l’inversion de dépendance.
  • #14: Qu’est ce que l’injection de dépendance ? Si on prend nos couches applicatives du dessus et que je souhaite construire mon application. Je vais devoir les instancié moi-même. 1- Avec l’injection de dépendance, on va déléguer au conteneur l’instanciation de nos couches applicatives et il injectera les dépendances nécessaires à chacune de ses couches. 2- Via l’injection de dépendance, le conteneur IOC va retirer le contrôle de la création des composants applicatif au développeur : On inverse le contrôle L’applicationContext est le composant de Spring qui va s’occuper d’instancier les composants nécessaires au fonctionnement de notre application. Il donne aussi des moyens d’accéder à nos composants, c’est aussi ServiceLocator.
  • #15: Et c’est là que le premier Design Pattern apparait. L’applicationContext de Spring nous crée nos composant : C’est une Factory. 1- L’applicationContext apporte plus de fonctionnalité que juste crée nos composants mais elle reste avant tout une Factory
  • #16: 1- Le context va d’abord scanné les définitions des composant à instancier 3- Il instancie les composants via la réfléxisivité en utilisant la méthode d’injection définit dans la définition 4- Il référence les dépendances en créant un dictionnaire qui associe une instance à son nom et son type. Ce dernier référencement est ce qui permet à l’applicationContext d’être aussi un serviceLocator
  • #19: L’ApplicationContext de Spring nous crée les composants et les référence. 1- On peut donc aller un peu plus loin dans l’inversion de contrôle et donné le contrôle du cycle de vie de nos composants au Contexte Spring. 2- Spring à utiliser la notion de Scope pour définir le cycle de vie de nos composants => C’est une interface du framework que l’on peut implémenter pour définir un scope de vie custom 3- Et là un autre Design Pattern, le Singleton ! Ce scope indique à Spring qu’une seule instance de ce composant doit être crée et injecté à chaque demande de dépendance. Le singleton vivra aussi longtemps que le context Spring vivra. 4- Et encore un design Pattern, le Prototype ! Ce scope indique à Spring de créer une nouvelle instance à chaque fois que l’on demande au conteneur. Comme décrit par le design Pattern, on « clone » une instance. 5- Pour obtenir une nouvelle instance à chaque fois qu’on le souhaite, on peut injecter une ObjectFactory (ou Provider) … 6- Les scopes lié au context Web comme Request ou Session. Ils vivent par exemple le temps de la request web. Ils implémentent l’interface Scope qui fera appel à l’ObjectFactory quand il y a besoin d’une nouvelle instance (nouvelle requête, nouvelle session).
  • #22: On a vu que Spring prenait le contrôle sur l’instanciation des composants et leur cycle de vie mais il reste encore à voir comment il fait pour prendre le contrôle sur le flux d’exécution. 1- Pour cela, on va parler un peu d’AOP. La programmation orienté aspect a pour but de dissocié les préoccupations transversales souvent technique du code métier. On va créer des aspects techniques comme la journalisation, la gestion des transactions que l’on va tisser autour des composants métiers qui peuvent en avoir besoin.
  • #23: Ce que l’on souhaite ici, c’est de créer un context transactionnel en ouvrant une transaction avant d’appeler sayHello() et quand sayHello() a fini de s’exécuter, on ferme le contexte transactionnel en appelant rollback ou commit en fonction de comment a fini l’appel à la méthode. On voudrait tisser l’aspect transactionnel autour de la méthode. 1- Pour cela on va utiliser un design pattern le Proxy ou un Décorator … un peu des deux en fait. Le Proxy va controller l’accès à l’objet sous-jacent alors que le Décorator va ajouter une fonctionnalité Dans notre cas, la transaction peut être configurer comme demandant l’existence d’une transaction et donc bloquer l’accès à l’objet sous-jacent … et dans un autre cas simplement ajouter le contexte transactionnel
  • #24: Comme Spring a pris le contrôle sur la création de nos composants et fait l’injection de dépendance, Il peut à ce moment-là décider (si on lui demande) de créer des proxys autour de nos composants pour y ajouter des aspects. Et pour cela, il a deux méthodes pour le faire avec le module Spring-AOP 1- CGLIB va créer un proxy en utilisant l’héritage. Il peut proxier n’importe quelle classe non finale. 2- JDK proxy peut créer un proxy autour d’une classe à condition qu’elle implémente une interface.
  • #25: Au fait, j’avais parlé d’Inversion de dépendance plus haut comme un cheveu sur la soupe mais ici ça prend du sens. En dehors du fait que l’inversion de dépendance est importante tout court  1- Dans ce cas Spring ne peut prendre le contrôle que sur la création du Controller et donc ne peut créer un proxy que sur celui-ci. Ce qui implique que l’on ne peut pas mettre l’aspect transactionnelle dans le service appelé par le controller même si l’annotation est présente. 2- D’où l’importance de mettre en œuvre l’inversion de dépendance dans la création de nos composants, ce qui nous apporte Modularité, flexibilité et réutilisabilité qui sont essentiel à l’utilisation de l’AOP dans Spring
  • #26: Maintenant que l’on a un proxy autour de notre composant, on peut ajouter autant d’aspect que l’on souhaite, comme ici Transactionnel, Journalisation, Cache. 1- Si on reprend le schéma du dessus ça va se modéliser de cette façon, on aura un proxy autour de notre service qui aura un ensemble d’advisor (Loggable, Cacheable, Transactionnal) qui ajouteront une fonctionnalité et/ou interdiront l’accès au composant sous-jacent contenant le code métier. 2- Nouveau design Pattern : Chaine de Responsabilité
  • #27: Donc si on résume, on pourrait faire le schéma suivant où tous nos composants sont proxyfier par Spring à leur création … ce qui nous ramène au schéma suivant. Spring a pris le contrôle sur le flux d’exécution et notre travail consiste à pluguer le code applicatif dans le framework
  • #30: Les briques sont en place pour avoir un framework d’inversion de contrôle mais il fallait aussi s’insérer dans l’écosystéme du moment et c’était J2EE. Ils ont donc crée la DispatcherServlet. Son rôle était simplement de dispatcher la bonne requête au bon contrôleur. On demandait donc au conteneur IOC d’instancier une dispatcherServlet et d’y définir le routing en associant une URL au Controller en charge de traiter la demande. Ce que le developpeur avait besoin de faire : Déclarer la DispatcherServlet dans le web.xml comme Servlet qui répond à toute les requête Définir le listener ContestLoaderListener qui démarrera l’ApplicationContext de Spring et instanciera tous nos composants On simplifie au maximum le travail du developpeur auprès de l’API J2EE. Mais ici il reste une préoccupation transversale qui reste à la main du developpeur : 1- La communication avec la base de données
  • #31: Pour communiquer avec la base de données, on peut utiliser l’API de Java JDBC. Elle présente énormément d’avantage mais peut-être un peu lourde à utiliser On voit ici que l’on doit demander une connection, créer un preparteStatement, mettre les paramètres, exécuter la requête, récupérer le resultSet, itérer dessus, mapper les lignes du resultset vers notre entité. Et encore ici j’ai utilisé les try with resources de Java 7, à l’époque il fallait en plus les close finally pour fermer correctement les ressources. 1- Si on regarde bien, le developpeur a besoin de définir trois choses, la requête à exécuter, les éventuels paramètres, et un mapper qui va transformer le resultset vers nos entités. Tout le reste se fera de la même façon. On aimerait que le framework prenne le contrôle sur ces aspects techniques récurrent.
  • #34: Les fondations de Spring sont celle-ci !
  • #35: Spring est perçu comme une alternative plus simple et plus légère que l’utilisation directe des Api J2EE. Il devient un standard que l’on utilise dans une majorité des projets Java. Spring développe alors d’autres modules au dessus de ses fondations pour répondre à d’autres problématique. On voit d’ailleurs apparaitre plein de template : JmsTemplate, RestTemplate, HibernateTemplate etc …
  • #36: La sécurity de nos endpoint est une préocuppation transversale qui est souvent communes à l’ensemble de nos points d’entrée Web. Spring a donc crée ce module pour adresser cette problématique transversale. On va pouvoir configurer une chaine de filtre en amont de nos Endpoint, on pourra par exemple ajouter à cette security chain un filtre qui nous permettra de valider et extraire des informations de notre token JWT. Les filtres s’enchainent les uns après les autres chacun ayant un rôle et pouvant empêcher l’accès au filtre suivant. Le développeur va ajouter le code qui est propre à son application et le pluguer dans cette chaine de filtre … qui est au final une chaine de responsabilité.
  • #37: Avec Spring-data-jpa, spring a retiré au developpeur l’implémentation des DAOs. Au lieu d’avoir à implémenter un DAO qui va orchestrer les appels au template pour appeler la base de donner, Spring nous demande juste de créer une interface qui va étendre l’interface JpaRepository propre à une entité JPA. On pourra ajouter des méthodes à cette interface pour ajouter des opérations sur cette entité et donc les relations en base de données associé à cette entité. Si on respecte certaines conventions alors Spring pourra créer une implémentation à cette méthode pour faire l’opération désiré. Dans notre cas ici, il fera une implémentation qui executera un select sur la table des users avec un filtre sur les noms.
  • #38: On a finit par avoir une galaxie de module qui gravite autour de ses fondations : Spring-core.
  • #39: Mais avec cette Galaxie de module, le framework s’est alourdit et a commencé à être difficile à comprendre et surtout à mettre en place. Si je veux une application web qui fait appel à la base de donnée il faut : Configurer le web-xml la data source la platforme de transaction etc … C’est lourd, toujours fait de la même façon et souvent on a oublié pourquoi on avait besoin de déclarer ces définitions Et ça c’est aussi sans compter les problèmes de conflit de version de dépendance des versions
  • #40: En réponse à cela, Spring lance le projet Spring-Boot pour adresser ces problématiques. Deux concepts sont introduits : 1- Auto-configuration : Si on reprend notre schéma du dessus sur notre application Web, on se rend compte que beaucoup de configuration pourrait être faite par défaut par Spring.
  • #41: Nos projets vont maintenant avoir comme projet parent une version de Spring boot. Cette version de Spring-Boot va figer un ensemble cohérent de version des modules. 1- Gestion des dépendances : On aura plus de conflit de version et chaque starter importera les dépendances nécessaires à son fonctionnement (pas besoin d’importer Spring-AOP, il viendra avec le starter) 2- Chaque starter vient avec ses configurations par défauts Le starter Web va automatiquement nous crée et configurer la DispatcherServlet en fonction des controller que l’on aura créé dans le projet. Il démarrera le conteneur web (tomcat par défaut) dans lequel notre application sera déployée. 3- Cette auto-configuration est basé sur les annotations conditional qui s’activeront par exemple si aucun configuration de datasource existe dans le projet. Il est donc toujours possible de surchargé cette configuration par défaut pour coller à une spécificité de nos projets.
  • #43: Pourquoi ce message ?