I. Introduction▲
Considérant deux conférences étroitement liées : « Spring 4 TW » et « Des applications réactives avec Spring 4, AngularDart et Websocket », j'ai trouvé pertinent de rédiger quelques lignes pour vous les faire (re)vivre.
II. Spring 4 TW (‘Four The Win' … ou ‘The Web' ?)▲
La conférence, par Joshua Long : @starbuxman
http://www.joshlong.com/
Le framework Spring 4, présent depuis les fêtes de fin d'année, a dans sa hotte quelques nouveautés bien situées dans les tendances actuelles, parmi lesquelles l'aide au développement d'applications réactives en Java. Et, pour nous les présenter, Josh Long, évangéliste et fervent contributeur sur Spring Source, est intervenu le 17 avril dernier à Devoxx FR.
II-A. De nouvelles annotations pour l'inversion de contrôle▲
Car, pour Spring, les injections sont toujours le nerf de la guerre !
Comme l'on souhaite…
- @Lazy sur un point d'injection ou un bean annoté permet d'indiquer que l'instanciation ne sera réalisée qu'au tout dernier moment. Donc un apport de flexibilité et de performances.
- @Ordered sur des beans voués à peupler une collection annotée @Autowired définira l'ordre de priorité lors de leur injection dans cette collection.
… mais pas n'importe comment !
@Conditional régit les prérequis pour enregistrer un bean, et fournit par rapport à @Profile, la possibilité de définir un ensemble de conditions à satisfaire. Par conséquent, davantage de flexibilité. Ces conditions sont décrites par programmation, en implémentant l'interface éponyme.
II-B. En phase avec Java, bien sûr !▲
Tout spécialement avec JEE 7, cette API ayant évolué pour JCache, JMS, JPA, JTA… Mais aussi avec Java 8 fraîchement disponible : Spring 4 compile avec la dernière mouture du langage, sans toutefois la rendre obligatoire : les versions 5.0 à 7.0 sont toujours supportées.
II-C. Orienté Web réactif, assurément▲
Support des WebSockets par la Messaging API
Les WebSockets ont été introduites avec HTML5 pour faciliter le « push » d'informations vers le client en réutilisant l'architecture réseau d'HTTP. Spring 4 est compatible avec la bibliothèque cliente JavaScript SockJS. Cette dernière sait faire transiter les messages via STOMP, protocole de messagerie simplifié. Pour acheminer et traiter de tels messages, un broker par défaut est fourni. À noter qu'il peut tout à fait être remplacé par un plus complet, tel RabbitMQ.
Sur le serveur, des annotations supplémentaires font leur apparition au niveau du code d'un contrôleur :
- @MessageMapping, qui établit le lien entre un message et la méthode devant le traiter ;
- @SendToUser qui, positionné sur une méthode, indique la destination du message contenant la valeur de retour de cette méthode.
Mais ceci n'est que la partie immergée de l'iceberg…
Le support WebSockets n'est qu'une facette de la Messaging API, qui a une vocation plus large : celle de mettre en place des architectures orientées message. Dans cette optique, une abstraction de messagerie a été mise en place ; une de ses extensions concrètes est d'ailleurs la SimpMessagingTemplate et ses SimpMessageReceiving/SendingOperations, préintégrées.
II-D. Let's get it started : Spring Boot▲
Spring Boot nous a été présenté comme un nouveau framework permettant de bâtir et d'exécuter avec Spring un large panel de solutions, d'applications Web aux applications d'entreprise. Il s'adresse à un public à qui Roo et Grails n'auraient pas paru adaptés.
Le paradigme « Convention Over Configuration » est poussé ici jusqu'à donner la possibilité d'annoter par @EnableAutoConfiguration, afin que Spring injecte les beans les plus pertinents. Pour rester dans le domaine « magique », @RestController met en place un réel contrôleur REST, simplifiant sa mise en place et nécessitant donc d'écrire moins de lignes de code.
En sus, une application tournant avec Spring Boot peut se voir automatiquement affublée d'end-points REST permettant de la monitorer via HTTP : /metrics, /beans, /health… et d'un shell intégré.
Ce sujet ayant fait l'objet d'une miniconférence ou « quickie », je ne peux que vous conseiller de lire l'article dédié à celle-ci, sur ce même blog.
II-E. Mais encore ?▲
Ce tour d'horizon sur Spring 4 étant bouclé, je vous propose d'enchaîner sur du concret, par une de ses mises en application.
III. Une stack Web réactive▲
Une conférence animée par Sébastien Deleuze : @sdeleuze
Devoxx est logiquement l'occasion de présenter des projets mettant en œuvre les dernières technologies en date. C'est le cas du projet OpenSnap, réalisé par Sébastien Deleuze, qui fait la part belle à Spring 4 et au langage Dart.
III-A. Le projet OpenSnap▲
Cette application Web HTML5 vise à reproduire le fonctionnement de l'application pour smartphone SnapChat, dont le but est de partager des images via messagerie instantanée, qui sont automatiquement supprimées quelques secondes après visualisation. Initiée et motorisée par Spring Boot, elle est actuellement opérationnelle en bêta (navigateur Chrome seulement) et peut être accédée via ce lien.
Les paragraphes qui suivent vont détailler la stack technique mise en œuvre.
III-B. Les outils de développement▲
Build
Le cycle de vie de l'application est confié à Gradle, équipé des plugins Spring-Boot, Java pour traiter la partie back et sa gestion de dépendances. Côté front, Gradle pilote les commandes du SDK Dart : pub (gestionnaire de paquets) et dart2js (générateur de code Javascript à partir de code Dart).
Édition du code source, refactoring et plus encore
On retrouve ici IntelliJ de JetBrains, totalement opérationnel en version communautaire sur ce projet. Le support de Gradle s'effectue en natif, celui du langage Dart peut être ajouté par le biais d'un plugin.
III-C. Front▲
Comme annoncé en préambule, OpenSnap côté client repose sur le langage Dart, poussé par Google. Disponible aujourd'hui en version 1.3, il vise à pallier les lacunes de JavaScript en termes de performances et de respect du paradigme objet. Une de ses caractéristiques est de pouvoir être exécuté en natif sur un navigateur Web compatible : Dartium et prochainement Chrome ; mais aussi d'être « transpilé » (ou converti) en JavaScript pour adresser tous les autres navigateurs. Concrètement, les fichiers .dart et les .js générés à partir d'eux sont portés simultanément par le serveur.
Parmi les apports de Dart, on peut citer la fonctionnalité native de routing, permettant d'adresser des traitements spécifiques selon l'URL demandée.
Dart est ici accompagné du framework Angular.dart qui, au départ, était un portage d'Angular.js, mais qui est devenu en quelque sorte sa vitrine, incluant les fonctionnalités en avance de phase. Ce qui est le cas pour les prochaines évolutions du framework en version 2.0 : il y a une forte probabilité pour qu'une partie atterrisse rapidement dans Angular.dart.
III-D. Back▲
La partie back-end repose sur Java 8 et le framework Spring 4 bien sûr ; pour son support des WebSockets ; Spring Security est, quant à lui, en version 3.2. Spring Boot, sur lequel l'application a été générée, fournit pour sa part un serveur Tomcat embarqué, un shell intégré et l'interface de contrôle REST Actuator.
La version de démonstration OpenSnap ne dispose pas de mécanisme de persistance.
III-E. Quid du middleware ?▲
Les images prises par l'appareil photo ou webcam du client sont transférées au serveur, qui va les pousser sous forme de messages vers le destinataire, utilisateur également enregistré sur le système.
La communication entre les deux parties est assurée par échange de messages à travers WebSockets avec la bibliothèque cliente SockJS (le client Dart en l'occurrence). Le traitement et l'acheminement des messages font intervenir un SimpleBrokerMessageHandler, le broker intégré à Spring 4.
IV. Mes impressions à la sortie▲
Techniquement, sans être révolutionnaires, les apports de Spring 4 permettent d'envisager plus sereinement l'émergence de nouvelles applications Web sur nos terminaux. Ces applications, non plus seulement dynamiques, mais réactives, sont multiplateformes et programmables en une seule fois pour toutes les adresser. Visons l'efficacité et le plaisir de travailler, ne nous gênons surtout pas !
Et plus généralement, l'introduction de nouveautés du front-end au back-end, sans oublier dans leurs moyens de communication, motivent à développer des projets Web avec le tandem de langages Dart + Java. Mises bout à bout, elles constituent une stack relativement facile à mettre en place et à utiliser, sans mettre les performances de côté. Pour que, finalement, le développeur puisse concentrer son énergie sur les fonctionnalités du projet, sa valeur ajoutée.
V. Pour aller plus loin▲
- débuter avec Spring : http://spring.io/guides ;
- les sources du projet opensnap sur Github : https://github.com/sdeleuze/opensnap ;
- Cat selfies : http://www.sadanduseless.com/2014/01/cats-taking-selfies/.
VI. Remerciements▲
Cet article a été publié avec l'aimable autorisation de la société Soat.
Nous tenons à remercier Philippe DUVAL et Jacques THÉRY pour leur relecture orthographique attentive de cet article et Régis Pouiller pour la mise au gabarit.