Spring : tendances, nouveautés et perspectives



Documents pareils
Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Alfstore workflow framework Spécification technique

Auto-évaluation Aperçu de l architecture Java EE

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Spring par la pratique

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

THÉMATIQUES. Comprendre les frameworks productifs. Découvrir leurs usages. Synthèse

Architecture Orientée Service, JSON et API REST

Devenez un véritable développeur web en 3 mois!

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Création d une application JEE

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

Introduction à ElasticSearch

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Hibernate vs. le Cloud Computing

Compte Rendu d intégration d application

Objectif : Passer de l analyse métier et fonctionnelle à la définition des applications qui

GWT à l'épreuve du feu. by Sami Jaber (DNG Consulting)

Paris JUG. Spring Batch. Mardi 14 Mai Olivier Bazoud Julien Jakubowski

Projet de programmation (IK3) : TP n 1 Correction

Cours en ligne Développement Java pour le web

les techniques d'extraction, les formulaires et intégration dans un site WEB

Cloud. Définition? 08/11/2012. James Urquhart The Wisdom of Clouds

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

La base de données XML exist. A. Belaïd

Mise en œuvre des serveurs d application

GECKO Software. Introduction à MOBIDICK. Modular But Integrated Application Framework

BPEL Orchestration de Web Services

Web Tier : déploiement de servlets

Intégration de systèmes

JOnAS 5. Serveur d application d

4. SERVICES WEB REST 46

CQP Développeur Nouvelles Technologies (DNT)

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

Logiciel de gestion d emploi du temps

Introduction aux «Services Web»

Programme ASI Développeur

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

2 Chapitre 1 Introduction

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Messagerie asynchrone et Services Web

AngularJS pour une application d'entreprise

Android et le Cloud Computing

OpenPaaS Le réseau social d'entreprise

Nouveautés de Drupal 8. Léon

D une part, elles ne peuvent faire table rase de la richesse contenue dans leur système d information.

Francis Mignault. ! Coauteur : Expert Oracle Application Express. ! Membre du Oracle APEX Advisory Board apex.oracle.com/vote

Une Histoire de Migration Agile

Applications et Services WEB: Architecture REST

Bases Java - Eclipse / Netbeans

<Insert Picture Here> Maintenir le cap avec Oracle WebLogic Server

Le Web de Données Dan VODISLAV Université de Cergy-Pontoise Master Informatique M2 Plan

Déploiement de l infrastructure SOA. Retour d expérience Août 2013

Projet ESB - Retour d expérience

ASP.NET MVC 4 Développement d'applications Web en C# - Concepts et bonnes pratiques

Développer des Applications Internet Riches (RIA) avec les API d ArcGIS Server. Sébastien Boutard Thomas David

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

Technologies Web avancées. ING1 SIGL Technologies Web avancées

S7 Le top 10 des raisons d utiliser PHP pour moderniser votre existant IBM i

Java Naming and Directory Interface

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

Famille IBM WebSphere Application Server

Point sur les solutions de développement d apps pour les périphériques mobiles

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Cedric Dumoulin (C) The Java EE 7 Tutorial

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Technologies du Web. Ludovic DENOYER - ludovic.denoyer@lip6.fr. Février 2014 UPMC

Application Web et J2EE

Développement Web - Object Relational Mapping and Hibernate

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

NOVA BPM. «Première solution BPM intégr. Pierre Vignéras Bull R&D

L ACCROISSEMENT DE L ENTROPIE DES SYSTÈMES D INFORMATION EST-ELLE UNE FATALITÉ?

Jean-Philippe Paquette

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

De l authentification au hub d identité. si simplement. Présentation OSSIR du 14fev2012

Single Sign-On open source avec CAS (Central Authentication Service)

Formations qualifiantes pour demandeurs d emploi

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Construire une application marketing Facebook sur la plateforme Windows Azure

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

Auto-évaluation Programmation en Java

Open Source Job Scheduler. Installation(s)

Fiche Technique. Cisco Security Agent

BizTalk Server Principales fonctions

DSL. Domain Specific Language. À l'aide des technologies Eclipse Modeling. Goulwen Le Fur Le 23 novembre 2012

Nous vous garantissons un niveau élevé d exploitation de vos données

Refonte front-office / back-office - Architecture & Conception -

Application web de gestion de comptes en banques

Celui qui vous parle. Yann Vigara

1 JBoss Entreprise Middleware

INGÉNIEUR - DÉVELOPPEUR EXPÉRIMENT É PHP. 27 ans - 6 ans d'expérience

Transcription:

Spring : tendances, nouveautés et perspectives Paris JUG 13/11/2012 Arnaud Cogoluègnes

Speaker Arnaud Cogoluègnes Consultant chez Zenika Formateur certifié SpringSource Co-auteur Spring Batch in Action Spring Dynamic Modules in Action Spring par la pratique, 2nde édition

Un peu d'histoire... v. 0.9 : juin 2003 v. 1.0 : mars 2004 v. 1.1 : septembre 2004 v. 1.2 : mai 2005

Un peu d'histoire... v. 2.0 : octobre 2006 v. 2.5 : novembre 2007 Java config, SpEL, REST v. 3.1 : décembre 2011 annotations v. 3.0 : décembre 2009 namespaces XML profils, cache, Java config++

Une vision, des idées Simplification Injection de dépendances Programmation orientée aspect

Une vision?

«Gérer la plomberie»

public class TransferService { public void transfer(...) { openconnection(); begintransaction(); // code applicatif committransaction(); closeconnection();

public class TransferService { public void transfer(...) { // code applicatif P O +A Simplicité Réutilisation Testabilité

Changement => adaptation

<aop:config> <aop:advisor advice-ref="txadvice" pointcut="execution(* com.zenika.service.*.*(..))"/> </aop:config> <tx:advice id="txadvice"> <tx:attributes> <tx:method name="update*" /> </tx:attributes> </tx:advice> public class TransferService { public void transfer(...) {

public class TransferService { @Transactional public void transfer(...) { <tx:annotation-driven />

Exécution, où?

Profils <beans profile="test">... </beans> <beans profile="prod">... </beans> <beans profile="cloud">... </beans> 3.1

Profils <beans profile="test"> <jdbc:embedded-database id="datasource" type="h2" /> </beans> <beans profile="prod"> <jee:jndi-lookup id="ds" jndi-name="java:comp/env/jdbc/ds" /> </beans> <beans profile="cloud"> <cloud:data-source id="datasource" service-name="contactds"/> </beans>

Activation des profils Ligne de commande -Dspring.profiles.active="prod" Programmatiquement GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.getenvironment().setactiveprofiles("test"); ctx.load("classpath:/application-context.xml"); ctx.refresh();

Où suis-je? public void initialize(configurableapplicationcontext ctx) { CloudEnvironment cloud = new CloudEnvironment(); if(cloud.getinstanceinfo() == null) { ctx.getenvironment().setactiveprofiles("default"); else { ctx.getenvironment().setactiveprofiles("cloud");

Solutions de configuration <XML /> Solution «historique» Externe Puissante Externe Centralisée Non-intrusive Limitée Java Java! Pas de namespace3.1 Namespaces @nnotations Rapide Type-safe Intrusive Décentralisée

<XML /> <bean id="transferservice" class="com.zenika.service.transferserviceimpl" > <constructor-arg ref="accountrepo" /> </bean> <bean id="accountrepo" class="com.zenika.repo.jdbcaccountrepository" > <constructor-arg ref="datasource" /> </bean>

@nnotations @Service public class TransferServiceImpl { @Autowired private AccountRepository accountrepository; @Repository public class JdbcAccountRepository implements AccountRepository { @Autowired private DataSource ds; <context:component-scan base-package="com.zenika" />

Configuration Java @Configuration public class AppConfig { @Autowired private DataSource ds; @Bean public TransferService transferservice() { return new TransferServiceImpl(accountRepo()); @Bean public AccountRepository accountrepo() { return new JdbcAccountRepository(ds);

@Enable* <=> namespaces @Configuration @EnableTransactionManagement public class AppConfig { @Autowired private DataSource ds; @Bean public TransferService transferservice() { return new TransferServiceImpl(accountRepo()); @Bean public AccountRepository accountrepo() { return new JdbcAccountRepository(ds);

@Enable* <=> namespaces

Solutions de configuration

Solutions de configuration Chacune avec ses avantages/inconvénients Iso-fonctionnelles Prendre la plus adaptée à ses besoins Bonne cohabitation dans une même application

REST SOA ROA HTTP Alternative Simple Protocole applicatif JSON

REST GET /crud-rest/zen-contact/contacts/1 HTTP/1.1 Accept: application/json Host: localhost:8080 HTTP/1.1 200 OK Content-Type: application/json {"id":1,"firstname":"joe","lastname":"dalton","age":37 @Controller public class ContactController { @Autowired ContactRepository contactrepository; @RequestMapping(value="/contacts/{id",method=RequestMethod.GET) @ResponseBody public Contact contact(@pathvariable Long id) { return contactrepository.findone(id); 3.0

REST GET /crud-rest/zen-contact/contacts/1 HTTP/1.1 Accept: application/json Host: localhost:8080 HTTP/1.1 200 OK Content-Type: application/json {"id":1,"firstname":"joe","lastname":"dalton","age":37 @Controller public class ContactController { @Autowired ContactRepository contactrepository; @RequestMapping(value="/contacts/{id",method=RequestMethod.GET) @ResponseBody public Contact contact(@pathvariable Long id) { return contactrepository.findone(id); 3.1

Changement? Refactoring complet entre 3.0 et 3.1 Traitement des méthodes des contrôleurs 100% compatible Nouveaux points d'extension

Spring : stabilité, compatibilité

Spring MVC : extensibilité @Controller public class ContactController { @Autowired ContactRepository contactrepository; @RequestMapping(value="/contacts/{id",method=RequestMethod.GET) public ResponseEntity<Contact> contact(@domain Contact contact) { ResponseEntity<Contact> response = new ResponseEntity<Contact>( contact, contact == null? HttpStatus.NOT_FOUND : HttpStatus.OK ); return response;

Spring MVC : extensibilité @Controller public class ContactController { @Autowired ContactRepository contactrepository; @RequestMapping(value="/contacts/{id",method=RequestMethod.GET) public ResponseEntity<Contact> contact(@domain Contact contact) { ResponseEntity<Contact> response = new ResponseEntity<Contact>( contact, contact == null? HttpStatus.NOT_FOUND : HttpStatus.OK ); return response; 3.1

Spring MVC et popularité Source : http://zeroturnaround.com/blog/developer-productivity-report-2012-java-tools-tech-devs-and-data/

Utilisations de Spring MVC Navigateur HTML Spring MVC Client REST Spring MVC Navigateur REST + AJAX Spring MVC

Utilisations de Spring MVC Navigateur HTML Spring MVC Client REST Spring MVC t e te a l p ien m Te ie cl t s e art R + la p r u o p Navigateur REST + AJAX Spring MVC

Test @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring-jpa.xml") public class AccountRepositoryTest { @Autowired private AccountRepository repo; @Test public void save() { // test...

Test @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring-jpa.xml") public class AccountRepositoryTest { @Autowired private AccountRepository repo; @Test public void save() { // test...

Test + profils @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/spring-jpa.xml") @ActiveProfiles("test") public class AccountRepositoryTest { @Autowired private AccountRepository repo; @Test public void save() { // test... 3.1

Test + Java config @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class AccountRepositoryTest { @Autowired private AccountRepository repo; @Test public void save() { // test... @Configuration public static class SpringJpaConfiguration { @Bean public DataSource ds() {... 3.1

Spring MVC test «no container» @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration public class MetaModelControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockmvc; @Before public void setup() { this.mockmvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); @Test public void list() throws Exception { (...)

Spring MVC test «no container» @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration public class MetaModelControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockmvc; @Before public void setup() { this.mockmvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); @Test public void list() throws Exception { (...)

Spring MVC test «no container» (...) public class MetaModelControllerTest { (...) @Test public void list() throws Exception { mockmvc.perform(get("/metamodel").accept(mediatype.application_json)).andexpect(status().isok()).andexpect(content().contenttype("application/json;charset=utf-8")).andexpect(jsonpath("$[0].name").value("name1")).andexpect(jsonpath("$[1].name").value("name2")); @Test public void createok() throws Exception { mockmvc.perform(post("/metamodel").content(format(object(field("name", string("new"))))).contenttype(mediatype.application_json)).andexpect(status().iscreated()).andexpect( header().string("location", "http://localhost/metamodel/new") );

Spring MVC test «no container» (...) public class MetaModelControllerTest { (...) @Test public void list() throws Exception { mockmvc.perform(get("/metamodel").accept(mediatype.application_json)).andexpect(status().isok()).andexpect(content().contenttype("application/json;charset=utf-8")).andexpect(jsonpath("$[0].name").value("name1")).andexpect(jsonpath("$[1].name").value("name2")); @Test public void createok() throws Exception { mockmvc.perform(post("/metamodel").content(format(object(field("name", string("new"))))).contenttype(mediatype.application_json)).andexpect(status().iscreated()).andexpect( header().string("location", "http://localhost/metamodel/new") ); 3.2

Cache public class ContactRepository { @Cacheable("contacts") Contact findone(long id) {... <cache:annotation-driven /> <bean id="cachemanager" class="...">... </bean>

Cache Client Spring cache Cible 3.1

Portfolio Spring

Portfolio Spring Spring Mobile / Spring Android Spring Social

Spring Data

Spring Data JPA Métier Accès données JPA DAO dynamiques, intelligents Moins de code répétitif Testabilité Conventions Pagination & tri Approche DDD

Spring Data JPA public interface ContactRepository extends JpaRepository<Contact, Long>{ <jpa:repositories base-package="com.zenika.repository" /> List<Contact> cts = repo.findall();

Spring Data JPA public interface ContactRepository extends JpaRepository<Contact, Long>{ List<Contact> findbylastname(string lastname); List<Contact> cts = repo.findbylastname("potter");

Spring Data MongoDB DAO dynamiques MongoTemplate Mapping objet-document DSL requête et mise à jour

Spring Data MongoDB public interface ContactRepository extends MongoRepository<Contact, String> { List<Contact> findbyfirstname(string firstname); <mongo:repositories base-package="com.zenika.repository" /> List<Contact> cts = repo.findall(); List<Contact> cts = repo.findbylastname("potter");

Spring Data MongoDB, API query import static o.s.data.mongodb.core.query.criteria.*; import static o.s.data.mongodb.core.query.query. query; List<Entry> entries = mongoops.find( query(where("tags").size(2)), Entry.class );

Spring Data MongoDB, API query import static o.s.data.mongodb.core.query.criteria.*; import static o.s.data.mongodb.core.query.query. query; List<Entry> entries = mongoops.find( query(where("tags").size(2).and("author").is("acogoluegnes")), Entry.class );

Spring Data MongoDB, API query

Spring Data JPA/MongoDB Spring Data JPA Spring Data MongoDB Spring Data Commons Spring

Spring Data REST Spring MVC et Spring Data JPA Support MongoDB en cours de développement Opérations CRUD suivant la sémantique REST Gestion des relations Navigation entre entités «HATEOAS»

Spring Data REST

Spring Data REST Spring Data JPA Spring Data REST Spring HATEOAS Spring Data Commons Spring

Intégration Client Web app.

Intégration Client Workers Workers Web app.

Intégration Client Web app. App.

Intégration Client Spring Integration / Spring AMQP Workers Workers Web app. App.

Intégration Client Web app. Spring Batch Spring Integration

Spring Integration Spring Integration Système de fichiers FTP SFTP... Composant applicatif O J PO Application

Spring Integration

Spring Integration Lightweight messaging Enterprise Integration Patterns Routage, transformation, etc. Configuration XML, @ + DSLs Scala, Groovy

Spring Integration <=> bus Frontend Web Spring Integration Bus Spring Integration Routage Backend 1 Transformation Signature Backend 2 Cryptage Backend 3

Spring Integration & Spring Batch Spring Batch Admin Spring Integration Spring Batch Application

Spring Batch Traitements par lot Saut suite à erreur, retry Reprise sur erreur Fichiers plats/xml, JDBC/Hibernate, JPA, JMS, email Spring Batch Admin : console de monitoring web

Spring Batch & scaling Local partitioning Thread 1 Thread 2 Thread 3 Spring Batch

Spring Batch & scaling Remote partitioning Spring Batch Spring Batch Spring Batch Spring Batch

Spring Batch & Spring Hadoop Spring Batch Spring Hadoop Cluster Hadoop

Intégration Client Spring Integration / Spring AMQP Workers Workers Web app. App. Cache Spring Redis / Spring GemFire Spring Batch Spring Integration

Intégration et déploiement

Cloud Foundry Client Workers Workers Web app. App. Cache

Conclusion Technologies Spring Simplicité et souplesse Stabilité et pérennité Un framework pour chaque besoin en entreprise Une grande cohérence dans le portfolio

Questions?

Merci!