Plan
Introduction
Configuration
> Spring Core
Spring Web MVC
Spring Boot
Autres projets et conclusion
• Interfaces d’« awareness »
– Par défaut, un bean ne connaît pas le conteneur.
– Il est possible de rendre le conteneur visible par un
bean à l’aide de l’interface ApplicationContextAware
public class MonBean implements ApplicationContextAware
– En fait, on peut rendre un bean « aware » de
différentes parties du framework
• Contexte (conteneur)
• Contexte Web
• Son nom de bean dans la configuration…
24
Plan
Introduction
Configuration
> Spring Core
Spring Web MVC
Spring Boot
Autres projets et conclusion
• Gestion du cycle de vie
– Il est possible de spécifier les méthodes de cycle de
vie d’un bean dans la configuration
– On appelle ces méthodes « initialization callback » et
« destruction callback »
<bean id="exampleBean" class="[Link]“
init-method="init"
destroy-method="destroy"/>
– Spring fournit des mécanismes plus fins à l’aide des
interfaces LifeCycle et LifeCycleProcessor 25
Plan
Introduction
Configuration
> Spring Core
Spring Web MVC
Spring Boot
Autres projets et conclusion
• Remarques
– Il existe de nombreuses autres options de
configuration
• Collections
• Nested beans
• ...
[Link]
framework-reference/[Link]
26
Plan
Introduction
Spring Web MVC
Spring Core
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• MVC de type 2
– Front controller : DispatcherServlet (fournie par Spring)
– Contrôleurs délégués : composants (@Controller)
Source : [Link]
reference/html/[Link] 27
Plan
WebApplication
Introduction
Spring Core
Context
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Hiérarchies de contextes
– Root : 1 contexte
commun à l’application
– Servlet : des contextes
spécifiques à chaque
DispatcherServlet
Source : [Link]
[Link]/spring-framework-reference/
28
images/[Link]
Plan
WebApplication
Introduction
Spring Core
Context
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Configuration d’un Servlet WebApplicationContext
(obligatoire) 1/2
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>[Link]
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
</web-app>
– Remarques
• Cette configuration nécessite un fichier de configuration de
composants nommé : /WEB-INF/[Link]
• Mapper les URLs sur /* est une mauvaise idée… 29
Plan
WebApplication
Introduction
Spring Core
Context
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Configuration d’un Servlet WebApplicationContext
(obligatoire) 2/2
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-
class>[Link]</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/[Link]</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
</web-app>
– Permet de choisir le(s) nom(s) du(des) fichier(s) XML 30
Plan
WebApplication
Introduction
Spring Core
Context
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Configuration du Root WebApplicationContext
(facultatif)
– Exemple de fichier [Link]
<webapp>
<listener>
<listener-class>
[Link]
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/[Link]
/WEB-INF/[Link]</param-value>
</context-param>
31
</webapp>
Plan
Introduction
Composants MVC
Spring Core
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Exemple de contrôleur annoté
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook apptmentBook) {
[Link] = apptmentBook;
}
@RequestMapping(method = [Link])
public String get() {
return "appointments/today";
}
}
32
Plan
Frameworks MVC :
Introduction
Spring Core
Spring
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Spring Web MVC
– Méthodes de service (Handler methods)
• Annotées avec @RequestMapping (ou @GetMapping,
@PostMapping…)
• Permettent
– De récupérer les paramètres de la requête
– De faire du data binding entre les paramètres et le modèle
– D’appeler les beans concernés
– De passer les infos (Model) nécessaires à la vue pour générer la
réponse
• [Link]
framework-reference/[Link]#mvc-ann-methods 33
Plan
Frameworks MVC :
Introduction
Spring Core
Spring
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Spring Web MVC
– Méthodes de service (Handler methods)
• Signature « flexible »
– Paramètres
» Model, @ModelAttribute
» Paramètres de la requête : @RequestParam
» Paramètres « classiques des servlets : ServletRequest,
ServletResponse, HttpSession
» …
– Valeurs de retour
» String : nom de vue (cf. slide suivant)
» Objet View
» Objet ModelAndView
» String annotée @ResponseBody
» …
• [Link]
reference/[Link]#mvc-ann-methods 34
Plan
Frameworks MVC :
Introduction
Spring Core
Spring
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• Spring Web MVC
– Méthodes de service (Handler methods)
• Exemples
@RequestMapping
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
[Link]([Link](number));
// add more ...
}
@PostMapping("/login")
public ModelAndView login(LoginData loginData) {
if ([Link]([Link]())) {
return new ModelAndView("success", new User("test"));
} else {
return new ModelAndView("failure", null);
}
35
}
Plan
Introduction
Composants MVC
Spring Core
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• View resolving
– Objectif : faire correspondre une vue au retour du
contrôleur
– Interface View
• Traite la requête en fonction d’une technologie de vue
(JSP, JSF…)
– Interface ViewResolver
• Fournit un mapping entre nom de vue et objet View
36
Plan
Introduction
Composants MVC
Spring Core
> Spring Web MVC
Spring Boot
Autres projets et conclusion
• View resolving
– Exemple de configuration
<bean id="viewResolver"
class="[Link]
iewResolver">
<property name="viewClass"
value="[Link]"
/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
37
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Position du problème
– Actuellement : de nombreux projets peuvent être liés
à une application Spring
– Framework puissant mais lourd à configurer
• Objectif général
– Simplifier la configuration des projets
• Principe général
– Convention over configuration
38
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Principes
– Créer facilement une application Java standalone
• Avec très peu de configuration
– Les choix de configuration par défaut sont déjà faits (« opinionated »)
• Capable de faire tourner une application Spring (Web ou non)
• Avec en standard la gestion d’un ensemble de préoccupations
non fonctionnelles
– serveurs embarqués, sécurité, métriques, configuration externalisée…
– Pas de génération de code ni de fichier de configuration
XML
– Une interface en ligne de commande pour démarrer plus
rapidement
39
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Utilisation
– Créer un projet Maven qui hérite d’un parent
• spring-boot-starter-parent
– Insérer les dépendances et les plugins nécessaires dans le
[Link]
– Lier le code à une classe principale
• public static void main
– Lancer l’application
• Avec un goal Maven spécifique : mvn spring-boot:run
• Comme une application Java standard : java -jar …
• Générer un fichier war et le déployer sur votre serveur
40
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Exemple
<parent>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>[Link]-SNAPSHOT</version>
<relativePath/>
</parent>
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<plugin>
<groupId>[Link]</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
41
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Fonctionnement
– @EnableAutoConfiguration déclenche un ensemble de
mécanismes qui « devinent » la configuration en fonction
des dépendances dans le [Link]
• Exemple : spring-boot-starter-web projet Web
• Spring boot essaye aussi de deviner à partir des dépendances
non « spring-boot-starter-… »
– La méthode main appelle la méthode run de
SpringApplication avec en argument
• Le composant Spring principal
• Les arguments éventuellement passés en ligne de commande
42
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Exemple
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
@Controller
@EnableAutoConfiguration
public class SampleController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!"; }
public static void main(String[] args) throws Exception {
[Link]([Link], args);
}
}
43
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Structuration du code (annotations)
– @EnableAutoConfiguration Identifie la classe
principale et démarre la détection de configuration
– @ComponentScan déclenche la recherche de
composants dans les sous-packages
– @Configuration spécifie une classe de configuration
(annotation Spring standard)
44
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Structuration du code (annotations)
– @SpringBootApplication
• Rassemble les annotations
– @ComponentScan
– @Configuration
– @EnableAutoConfiguration
• À utiliser
– Pour « économiser » les annotations dans un projet standard
– Quand la classe principale n’est pas seule dans un package
45
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Starters
– Dépendances standard aux autres projets Spring dans le
[Link]
– Permettent à Spring Boot de générer une configuration
– Forme
• Starters « officiels » : spring-boot-starter-*
• Possibilité de créer ses starters soi-même : moi-spring-boot-
starter
– Liste des starters officiels
[Link]
SNAPSHOT/reference/htmlsingle/#using-boot-starter 46
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Structuration du code (bonnes pratiques)
– Pas de « default package »
– Position de la classe principale (point d’entrée)
• À la racine et les autres packages au-dessous (meilleure
solution)
• Pas seule dans un package (utiliser l’annotation
@SpringBootApplication)
– Préférer les classes de configuration Java plutôt que
les fichiers de configuration XML
47
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Configuration spécifique
– Si besoin de modifier la configuration par défaut
@Configuration
@EnableAutoConfiguration(
exclude={[Link]})
public class MyConfiguration {
...
}
48
Plan
Introduction
Spring Boot
Spring Core
Spring Web MVC
> Spring Boot
Autres projets et conclusion
• Création d’un projet vide
Spring Initializr : [Link]
49
Plan
Introduction
Spring AOP
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• Deux outils de POA dans Spring
– Spring AOP : basé sur CGLIB (dans Spring Core depuis
V5)
– AspectJ (depuis la version 2.5)
• Spring AOP
– Utilise des classes et de la configuration
• Un aspect est une classe « normale » (POJO)
• Les pointcuts relient le code de l’application aux méthodes
d’un aspect
– Permet le weaving à la compilation et à l’exécution
50
Plan
Introduction
Spring AOP
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• Spring AOP
– Exemple 1 : configuration XML
<aop:config>
<aop:pointcut id="servicePointcut"
expression="execution(* [Link].*.*(..))"/>
<aop:aspect id="loggingAspect" ref="monLogger">
<aop:before method="logMethodEntry"
pointcut-ref="servicePointcut"/>
<aop:after-returning method="logMethodExit"
returning="result" pointcut-
ref="servicePointcut"/>
</aop:aspect>
</aop:config>
<bean id="monLogger" class="[Link]"/>
51
<bean name="monService" class="[Link]" />
Plan
Introduction
Spring AOP
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• Spring AOP
– Exemple 2 : annotations
@Aspect
@Component
public class ExampleAspect {
@Before("execution(* [Link].*.*(..))")
public void doAccessCheck() {
// ...
}
@Around("[Link]()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws
Throwable {
// start stopwatch
Object retVal = [Link]();
// stop stopwatch
return retVal;
}
Source : [Link]
Plan
Introduction
Conclusion
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• Avantages de Spring
– Légèreté du framework (…)
– S’appuie sur des solutions open source éprouvées
– Possibilité de « plugger » d’autres fonctionnalités
– Configuration rapide des applications « simples »
– Très utilisé
– Documentation abondante
53
Plan
Introduction
Conclusion
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• Faiblesses de Spring
– Complexité croissante
• Beaucoup de sous-projets
• 3 types de configurations possibles
• Trop de « magie » ?
– Choix entre Spring et Java EE moins évident
• EJB 3.0 plus simples
54
Plan
Introduction
Références
Spring Core
Spring Web MVC
Spring Boot
> Autres projets et conclusion
• [Link]
• [Link]
framework-reference/html/
• [Link]
framework-reference/html/[Link]
• [Link]
• [Link]
SNAPSHOT/reference/htmlsingle/
• [Link]
• [Link]
55