Juergen Hoeller, ing�nieur principal chez Pivotal Inc et leader du projet Spring Framework, a annonc� la sortie de Spring 5.0 M2, le conteneur l�ger pour construire et d�finir l�infrastructure d�une application Java. Pour rappel, dans le document Introduction au framework Spring, Erik Gollot avan�ait que Spring est effectivement un conteneur dit � l�ger �, c�est-�-dire une infrastructure similaire � un serveur d'applications Java EE. Il prend donc en charge la cr�ation d�objets et la mise en relation d�objets par l�interm�diaire d�un fichier de configuration qui d�crit les objets � fabriquer et les relations de d�pendances entre ces objets. Le gros avantage par rapport aux serveurs d�application est qu�avec Spring, les classes n�ont pas besoin d�impl�menter une quelconque interface pour �tre prises en charge par le framework (au contraire des serveur d'applications Java EE et des EJBs). C�est en ce sens que Spring est qualifi� de conteneur � l�ger �.
Cette version apporte un nouveau framework web fonctionnel qui est bas� sur la programmation r�active qui a �t� apport�e dans Spring 5.0 M1. C�est Arjen Poutsma, un ing�nieur qui fait �galement partie du projet, qui s�est charg� de pr�senter quelques extraits des b�n�fices de ce framework avec l��chantillon d�application qui est disponible sur GitHub. Ci-dessous, un d�p�t r�actif qui expose des objets Person. Il ressemble en de nombreux points � un d�p�t traditionnel non r�actif, en dehors du fait qu�il retourne Flux<Person> o� vous aurez retourn� List<Person> et Mono<Person> o� vous aurez retourn� Person. Ici Mono<Void> est utilis� en guise de compl�tion du signal afin de signaler lorsque la sauvegarde est termin�e.
| Code : | S�lectionner tout |
1 2 3 4 5 | public interface PersonRepository {
Mono<Person> getPerson(int id);
Flux<Person> allPeople();
Mono<Void> savePerson(Mono<Person> person);
} |
| Code : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | RouterFunction<?> route = route(GET("/person/{id}"),
request -> {
Mono<Person> person = Mono.justOrEmpty(request.pathVariable("id"))
.map(Integer::valueOf)
.then(repository::getPerson);
return Response.ok().body(fromPublisher(person, Person.class));
})
.and(route(GET("/person"),
request -> {
Flux<Person> people = repository.allPeople();
return Response.ok().body(fromPublisher(people, Person.class));
}))
.and(route(POST("/person"),
request -> {
Mono<Person> person = request.body(toMono(Person.class));
return Response.ok().build(repository.savePerson(person));
})); |
| Code : | S�lectionner tout |
1 2 3 4 5 | HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
ReactorHttpHandlerAdapter adapter =
new ReactorHttpHandlerAdapter(httpHandler);
HttpServer server = HttpServer.create("localhost", 8080);
server.startAndAwait(adapter); |
HandlerFunction : le point de d�part de ce nouveau framework est HandlerFunction<T>, qui est essentiellement une Function<Request, Response<T>>, o� Request et Response sont des interfaces nouvellement d�finies et non permutables qui offrent un DSL JDK-8 friendly aux messages HTTP sous-jacents. Voici un exemple simple d�une HandlerFunction qui retourne une r�ponse avec un statut 200.
| Code : | S�lectionner tout |
1 2 | HandlerFunction<String> helloWorld =
request -> Response.ok().body(fromObject("Hello World")); |
| Code : | S�lectionner tout |
1 2 3 4 5 | RouterFunction<?> route =
route(path("/hello-world"),
request -> Response.ok().body(fromObject("Hello World")))
.and(route(path("/the-answer"),
request -> Response.ok().body(fromObject("42")))); |
FilterFunction : les chemins mapp�s par une fonction d�acheminement peuvent �tre filtr�s en faisant appel � RouterFunction.filter(FilterFunction<T, R>), o� FilterFunction<T,R> est essentiellement une BiFunction<Request, HandlerFunction<T>, Response<R>>. La fonction Handler en param�tre repr�sente le prochain �l�ment de la cha�ne. Notons qu�une autre FilterFunction peut �tre appliqu�e � sa place si de multiples filtres sont requis.
Et comment ex�cuter ces fonctions sur un serveur HTTP ? En appelant une autre fonction : HttpHandler. Il est possible de convertir une fonction d�acheminement en HttpHandler en se servant de RouterFunctions.toHttpHandler().
En gros, dans ce nouveau framework web propos� par Spring, ce que nous pouvons retenir c�est que :
- les fonctions de gestion (Handler) s�occupent des requ�tes en retournant des r�ponses ;
- les fonctions d�acheminement font parvenir les requ�tes entrantes aux fonctions de gestion et peuvent �tre compos�es de plusieurs fonctions d�acheminement ;
- les fonctions d�acheminement peuvent �tre filtr�es par des fonctions de filtrage ;
- les fonctions d�acheminement peuvent �tre ex�cut�es dans un environnement d�ex�cution web r�actif.
exemple illustratif de projet utilisant ce nouveau framework (GitHub)Source : blog Spring
Voir aussi :
Quels modules de Spring utilisez-vous en 2016 ? Venez partager votre exp�rience
Vous avez lu gratuitement 0 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer � vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer � vous proposer des publications.