Spring helps development teams everywhere build simple, portable, fast and flexible JVM-based systems and applications.
VUE D ENSEMBLE Considérer comme une alternative /remplacement au modèle Enterprise JavaBean (EJB) Flexible Intégrer à d autres langages de programmation (e.g..net) Réponse à des travaux de développements considérés comme lourd JDBC LDAP Web Services Services offerts IoC Inversion of Control ou Injection de dépendance Programmation orientée aspect Services d abstraction (ORM, JDBC, Web, Remoting.)
LA STACK SPRING
The IoC container Spring Expression Langage (SpEL) Internationalisation Testing
INJECTION DE DÉPENDANCE L IoC est un «Design Pattern» permettant de casser les dépendances. Il se base sur la notion d abstraction commune (c.à.d. l interface en Java) C est le Framework qui a la charge d injecter les dépendances. Il existe 4 types d'injections de dépendances : Injection par constructeur Injection par interface Injection par factory Injection par champs Démonstration des types d injection
THE SPRING IOC CONTAINER AND BEANS Définir les Beans ou objets exposés Configurer les metadata Instancier le conteneur de dépendances Utiliser le conteneur Attention aux dépendances circulaires Démonstration de la configuration XML <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> <! all bean definitions go here -->
AUTRES FRAMEWORK D INJECTION Pico Container (injection par constructeur) Excalibur (injection par Interface) Google Guice (injection par champs et constructeur) EJB 3
ANNOTATION-BASED CONTAINER CONFIGURATION Ajouter l espace de nom context dans la configuration XML de Spring Tag XML spécifique pour activer les annotations <context:annotationconfig/> Tag XML spécifique pour scanner les beans Spring <context:componentscan/> Les annotations Spring @Autowired Indique l injection de dépendance @Component Stéréotype Générique pour tout type de Bean géré par Spring @Scope("singleton") Définit le mode de proxy qui est réalisé pour le bean @Qualifier Supprime les doublons dans les noms des beans injectés @Value Permet d injecter la valeur de la propriété indiquée @Required Indique que la propriété est obligatoire pour le Bean @Lazy l instance du bean n est créé par Spring qu au moment où il est demandé (ou nécessaire) et non de manière systématique dans le cadre de l initialisation de l ApplicationContext
@AUTOWIRED @Autowired on Setter Methods Injection de dépendance par type; si une ou plusieurs références existent un erreur se produit. @Autowired on Properties Injection de dépendance par passage de paramètre ou par référence @Autowired on Constructors Indique que le constructeur devra être injecter avec une dépendance lors de la création du Bean, même si pas de déclaration du tag <constructor-arg> @Autowired with (required=false) option Par défaut la dépendance est obligatoire, en précisant required=false, l injection de la dépendance devient optionnel
@SCOPE Singleton Périmètre par défaut; une et une seule instance est créée pour l application et elle est partagée et réinjectée à chaque injection de dépendance Prototype Une instance est créée à chaque injection de donnée Request Création d une instance pour chaque requête HTTP Session Création d une instance au début d un session HTTP; cette instance est réutilisée pour la durée du cycle de vie de la session Global session Similaire à l annotation «session» mais dans le cadre des applications de type portlets Application Création d une instance au début de l application web; cette instance est réutilisée pour la durée de l application web Pour les scopes Request, Session, Global session et Application, le tag XML <aop:scoped-proxy/> doit être défini pour le Bean
Modèle de données Modèle de présentation DTO Data transfer Object LES AUTRES ANNOTATIONS @Service Stéréotype pour les beans de la couche de service @Repository Stéréotype pour les beans de la couche de persistance @Controller Stéréotype pour les beans de la couche de présentation(spring-mvc) Actions utilisateur Appels Web Service Présentation Connecteur Web Services @Controller Services Contrôleur de présentation Adapteurs/ Convertisseur de données @Service Services Métier @Repository DAO Data Access Object Base de données (MySQL, PostgreSQL, Oracle,.) Fichier plat Autre application
THE SPRING IOC CONTAINER AND BEANS Définir les Beans ou objets exposés Configurer les metadata Instancier le conteneur de dépendances Utiliser le conteneur Attention aux dépendances circulaires Démonstration de la configuration par annotation Annotation-based configuration Java-based configuration
SPRING EXPRESSION LANGAGE (SPEL) Spring EL est un langage d'expressions pour permettre l'interrogation et la manipulation d'objets au runtime : il permet de faciliter la configuration en utilisant un langage d'expressions. SpEL supporte de nombreuses fonctionnalités : expressions littérales, assignations, opérateurs, expressions régulières, manipulations de collections,... SpEL est utilisable : dans les fichiers de configuration Spring dans l'annotation @Value dans des JSP avec le tag <spring:eval> dans une application en utilisant une API dédiée
INTERNATIONALISATION Le Framework Spring offre la possibilité de gérer de fichiers de messages Les messages sont accessibles au travers du code suivant:
TESTING JUnit: "A programmer-oriented testing framework for Java". Used by the Spring Framework in its test suite. TestNG: A testing framework inspired by JUnit with added support for annotations, test groups, datadriven testing, distributed testing, etc. EasyMock: Java library " that provides Mock Objects for interfaces (and objects through the class extension) by generating them on the fly using Java s proxy mechanism. " Used by the Spring Framework in its test suite. JMock: Library that supports test-driven development of Java code with mock objects. Mockito: Java mock library based on the test spy pattern. DbUnit: JUnit extension (also usable with Ant and Maven) targeted for database-driven projects that, among other things, puts your database into a known state between test runs. The Grinder: Java load testing framework.
TESTING AVEC JUNIT Utilisation de la dépendence spring-test Configuration par annotation @RunWith(SpringJUnit4ClassRunner.class) :Intégration de Spring dans JUnit @ContextConfiguration :pour indiquer le ou les fichiers de configuration à prendre en compte @RunWith(SpringJUnit4ClassRunner.class) // specifies the Spring configuration to load for this test fixture @ContextConfiguration("repository-config.xml")
Data Access with JDBC DAO support Transaction Management Object Relational Mapping (ORM) Data Access
SPRING DATA ACCESS
JDBC DATASOURCE On retrouve la définition de l environnement JDBC comme suit: Driver URL de connexion Identifiant utilisateur de la BDD Mot de passe utilisateur de la BDD Quelle différence entre org.apache.commons.dbcp.basicdatasource et org.springframework.jdbc.datasource.drivermanagerdatasource?
TRAVAUX PRATIQUES Externaliser les informations de la datasource avec Maven Externaliser les informations de la datasource avec Spring en utilisant la classe PropertyPlaceholderConfigurer
SPRING JDBC Qui fait quoi? Action Spring You Define connection parameters. Open the connection. Specify the SQL statement. Declare parameters and provide parameter values Prepare and execute the statement. Set up the loop to iterate through the results (if any). Do the work for each iteration. Process any exception. Handle transactions. Close the connection, statement and resultset. X X X X X X X X X X
UTILISATION DE JDBC TEMPLATE Déclarer un bean JdbcTemplate, référençant une datasource Définir dans chaque classe DAO une propriété vers JdbcTemplate. Utiliser l instance de JdbcTemplate dans le corps de chaque méthode du DAO Déclarer chaque bean DAO avec la propriété référençant JdbcTemplate
UTILISATION DE JDBC TEMPLATE Créer une table T_MOTORISATION et insérer les motorisations possibles Créer une classe DAO EngineFirstDao avec la méthode insert pour créer une nouvelle motorisation Injecter la classe JdbcTemplate proposés par SPRING Tester Créer une classe DAO EngineSecondDao avec la méthode insert pour créer une nouvelle motorisation Injecter la classe NamedParamJdbcTemplate proposés par SPRING Tester Rajouter une méthode permettant de récupérer la liste des motorisations Utiliser l interface RowMapper pour la lecture de données Tester Reprendre le DAO EngineFirstDao en étendant la Classe JdbcDaoSupport de SPRING Tester
DAO PAR ANNOTATION Utilisation de l annotation @Repository Annotation à utiliser sur la classe d implémentation Déclaration de la balise <context:component-scan base-package= "nom_du_package" /> dans le fichier de configuration principal Scan automatique des annotations TRAVAUX PRATIQUES Appliquer l annotation sur les DAOs créés précédemment Modifier la configuration XML Rejouer les tests
GESTION DES TRANSACTIONS Spring propose plusieurs gestionnaires de transactions : org.springframework.orm.hibernate3.hibernatetransactionmanager : pour utiliser Hibernate org.springframework.transaction.jta.jtatransactionmanager : pour utiliser une implémentation de JTA fournie par un serveur d'applications org.springframework.jdbc.datasource.datasourcetransactionmanager : pour utiliser une datasource avec JDBC
GESTION DES TRANSACTIONS Une transaction gérée par Spring possède plusieurs caractéristiques : isolation : permet de préciser le niveau d'isolation de la transaction par rapport aux autres transactions. propagation : permet de préciser comment les traitements s'intègrent dans un contexte transactionnel timeout : le temps maximum durant lequel la transaction peut s'exécuter. Au delà, la transaction est annulée (rollback). read only : permet de préciser si les données sont lues uniquement ou si elles peuvent être mises à jour ceci à fin de permettre certaines optimisations
GESTION DES TRANSACTIONS CONFIGURATION PAR XML Utilisation de la dépendance spring-tx et spring-aspects La déclaration des transactions dans la configuration du contexte se fait dans le fichier XML en utilisant les espaces de nommages tx et aop. Il faut définir : un gestionnaire de transactions (TransactionManager) spécifique au mode de fonctionnement des accès aux données. un advice lié au gestionnaire de transactions qui va permettre de déclarer le mode de propagation des transactions dans les méthodes désignées par des motifs. la configuration des aspects à tisser sur les méthodes qui doivent être transactionnelles. Généralement, toutes les méthodes des services doivent être transactionnelles. Pour cela, le point de coupe doit utiliser une expression qui désigne toutes les méthodes et tous les services.
GESTION DES TRANSACTIONS CONFIGURATION PAR XML
TRAVAUX PRATIQUES Ecrire une classe de service permettant de créer une nouvelle motorisation pour un type de voiture Créer la motorisation Puis créer la paire TypeVoiture-Motorisation Volontairement ne pas tester si le type de voiture existe pour déclencher un rollback en base Tester le service sans gestion de transactions (Que se passe-t-il?) Inclure la gestion de transaction (Que se passe-t-il?)
CONFIGURATION PAR ANNOTATION Utilisation de la dépendance spring-tx Déclaration de la balise <tx:annotation-driven transactionmanager="txmanager"/> dans le fichier de configuration principal Utilisation de l annotation @Transactional qui s'utilise sur une classe ou une méthode. Sur une classe, elle s'applique automatiquement sur toutes les méthodes publiques de la classe. L'annotation @Transactional possède plusieurs attributs (dont propagation, readonly, isolation, timeout) Il est fortement recommandé de n'utiliser l'annotation @Transactional que dans des classes concrètes. Seules les invocations de méthodes depuis d'autres classes seront transactionnelles.
Tutoriel : http://jmdoudoux.developpez.com/cours/developpons/java/chapspring_transactions.php
TRAVAUX PRATIQUES Utiliser l annotation @Transactional sur la classe de service permettant de créer une nouvelle motorisation pour un type de voiture Tester
SPRING ORM & HIBERNATE
Web MVC Framework Integrating with other web frameworks
SPRING WEB
SPRING WEB FRAMEWORK Spring Web : Ensemble de classes utilitaires tournées vers le protocole HTTP Spring Web MVC : Spring (tout comme Struts) permet d'organiser une application Web selon le patron de conception MVC. Spring Web Portlet : Un portlet est une application informatique que l'on peut placer dans un portail web Spring WebSocket : Une WebSocket est une spécification d'un protocole permettant une communication bidirectionnelle et full duplex sur une seule socket TCP entre un client et un serveur. Spring Web Flow: Sous-projet de Spring Framework. Il permet de définir et d'exécuter des enchaînements de pages dans une application web.
INTÉGRATION DE SPRING ET STRUTS2 Utilisation de Struts 2 Spring Plugin pour rendre les beans Struts visible par le contexte Spring Intégration de la dépendance org.apache.struts:struts2-spring-plugin:jar Pour activer le contextespring dans une application Web, modifier le fichier web.xml: Ajouter la classe d écoute org.springframework.web.context.contextloaderlistener Préciser le ou les fichiers de configuration Spring à intégrer dans le contexte avec la déclaration du paramètre contextconfiglocation Déclarer tous les beans qui ont besoin de l injection de dépendence dans l application Documentation : https://struts.apache.org/docs/spring-and-struts-2.html Attention aux conflits avec les dépendances Spring
Spring Security vous permet de sécuriser vos applications web, qu elles utilisent Spring ou non. Documentation: http://www.mkyong.com/tutorials/spring-security-tutorials/
OBJECTIFS Maîtriser les étapes de sécurisation d une application web avec Spring. Mettre en œuvre ces étapes en sécurisant une application web S authentifier à travers une base de données avec Spring Mettre en œuvre différents filtres proposés par Spring Gérer les écrans en fonction des rôles utilisateurs
PROJET MAVEN Utilisation de la dépendance ci-dessous : Attention aux conflits avec les dépendances Spring
CONFIGURATION WEB.XML Déclarez l intercepteur de sécurité org.springframework.web.filter.delegatingfilterproxy comme filtre de l application La classe Spring DelegatingFilterProxy délègue la sécurité à une implémentation interne apellée springsecurityfilterchain, qui est dédiée à la gestion de la sécurité Spring. Notez que le filtre Spring Security doit être le premier à traiter la requête
CONFIGURATION SPRING Créer un fichier de configuration spring-security.xml contenant la stratégie de sécurité de l application Web Définir la stratégie de sécurité Web avec la balise Déclarer les utilisateurs autorisés Toutes les URLs de l application sont sécurisées (pattern="/**") Seuls les utilisateurs possédant un rôle ROLE_USER ont accès aux URLs 2 utilisateurs autorisés: identifiants, mots de passe et leur rôles. Les rôles entrent en jeu lors du contrôle d accès que Spring réalise sur les ressources/urls demandées, après l étape d authentification de l utilisateur.
TRAVAUX PRATIQUES Rajouter la configuration Spring Security dans le projet Configurateur Nissan Lancer l application (Que voyez-vous?)
ADAPTER LA PAGE DE LOGIN Généralement on utilise sa propre page de login Définir la page à afficher en cas de succès d identification ou d erreur dans la configuration Spring Modifier la configuration Struts2 pour prendre en compte la nouvelle page Exemple : Fichier Login.jsp URL à appeler lors de la validation du formulaire
ADAPTER LA PAGE DE LOGIN Généralement on utilise sa propre page de login Définir la page à afficher en cas de succès d identification ou d erreur dans la configuration Spring Modifier la configuration Struts2 pour prendre en compte la nouvelle page Exemple : Fichier spring-security.xml Autoriser les URL pour l index, la page de login et la page de déconnexion Indiquer à Spring Securiity que faire en cas de succès ou d échec d authentification
ADAPTER LA PAGE DE LOGIN Généralement on utilise sa propre page de login Définir la page à afficher en cas de succès d identification ou d erreur dans la configuration Spring Modifier la configuration Struts2 pour prendre en compte la nouvelle page Exemple : Fichier struts.xml Déclaration du package par défaut qui contient la page de login
TRAVAUX PRATIQUES Adapter la page d identification dans le projet Configurateur Nissan
AUTRES ASPECTS Validation des données Spring Expression Language (SpEL) AOP - Aspect Oriented Programming
MERCI
CONTENU 21H DE FORMATION Comprendre et utiliser ce Framework pour construire et définir l infrastructure d une application J2EE Facilitateur de développement et des phases de test Conteneur léger Similitudes avec un serveur J2EE Les fichiers de configuration pour les objets Recherche et injection de dépendances La couche d abstraction Les BEANS Autres Framework similaires