O Spring Framework 5.0 fornece um novo framework web reativo, que foi liberado em 28 de setembro de 2017. Pieter Humphrey, gerente de marketing de produto da Pivotal, disse que é versão mais significativa do projeto desde 2004.
Com esta liberação, o Spring 5.0 tem a sua base de código inteira baseada no nível de código-fonte do Java 8 e é compatível com o JDK 9 para desenvolvimento e implantação.
O framework web reativo do Spring 5.0 é o Spring WebFlux que é construída no Projeto Reactor 3.1 e suporta os estilos de programações com base em anotações e funcionais. O InfoQ conversou com Rossen Stoyanchev, engenheiro sênior da Pivotal, sobre o que ele acha da ênfase da programação reativa no Spring 5.0.
Stoyanchev: os desenvolvedores Java estão familiarizados com os benefícios de uma API do estilo de continuação para formar a lógica assíncrona do CompletableFuture no Java 8. Nos últimos anos estamos vendo também o crescimento das bibliotecas para compor as lógicas assíncronas, tais como: RxJava e Reactor, com benefício semelhantes a da CompletableFuture, mas para uma stream de valores e com suporte para backpressure (como modelado pela especificação da Reactive Streams).
O Spring Framework 5 permite que aplicações adotem este modelo de programação assíncrona com um framework web que seja completamente assíncrono em seus próprios fundamentais contratos, usando I/O não blocantes internamente, e suporte a Reactive Stream backpressure em cima de async runtimes, tais como: Netty e Undertow e também containers Servlets como Tomcat e Jetty (baseados sobre Servlet 3.1 I/O não blocantes). O benefício desta abordagem é o suporte first-class para compor a lógica assíncrona acoplada com um modelo de execução estilo event-loop que pode lidar com mais concorrência com menos recursos de hardware, em particular sob alta carga.
Stoyanchev disse que as mudanças no Spring 5.0 não terão impactos imediatos nas aplicações existentes, procurando atualizar desde que a nova funcionalidade existe lado a lado com o Spring MVC.
Em muitos casos as aplicações serão importadas em outras spring-webmvc (pilha Servlet) ou spring-webflux (pilha Reactive), e aplicações existentes podem ser facilmente atualizadas para a spring-webmvc da versão 5 do Spring Framework.
De acordo com Stoyanchev, o Spring 5.0 tem como objetivo fornecer uma escolha e consistência por meio do Spring MVC e Spring WebFlux, tanto quanto possível. Ambos os frameworks web suportam o mesmo modelo de programação baseada em anotações com assinaturas de métodos flexíveis nos controllers. Além disso, o Spring WebFlux também oferece uma alternativa, modelo de programação funcional web endpoint que pode ser atraente com lambdas do Java 8 e integradas com extensões Kotlin.
No Framework Spring 5 realmente ampliamos o Spring MVC com suporte para retorno de valores reativo, o que permite que o controller do Spring MVC aproveite o WebClient reativo e outras bibliotecas como a de repositório de dados reativo, enquanto continua funcionando em acordo com web endpoint baseados em Servlet sobre qualquer container Servlet 3.1+.
O InfoQ perguntou para Stoyanchev sobre as precauções que um desenvolvedor deve ter quando começa a usar o modelo de programação reativa com Spring 5.0
Os desenvolvedores devem saber que a lógica do estilo da escrita imperativa para o uso da declarativa e as APIs assíncronas tem uma curva grande de aprendizagem. Códigos assíncronos e não blocantes é também muito difícil de depurar porque não existe mais uma única pilha de chamada. Para os iniciantes, comece pequeno e gaste um tempo para aprender e se acostumar. Escolha cuidadosamente quais aplicativos são adequados e que podem se beneficiar mais com a concorrência não blocante. Medir e provar os benefícios do desempenho antes de decidir em prosseguir. Lembre-se que existem lugares simples para iniciar, tais como usar em aplicações existentes de Spring MVC o WebClient reativo.
O InfoQ também falou com Juergen Hoeller, líder do projeto Spring Framework, sobre o que ele pensa sobre o Spring 5.0.
Hoeller: Nossa baseline é o Java 8+, que traz refinamentos significantes nas APIs e muitas otimizações internas em todo o framework. Ao mesmo tempo, o Framework Spring 5.0 é fornecido com suporte abrangente com JDK 9 no classpath bem como o caminho módulo. O container principal vem com mecanismos funcionais de registro de bean para Java 8 e Kotlin.
Hoeller também mencionou que o Spring 5.0 fornece extensões Kotlin para API's comuns do Spring, tais como: JdbcTemplate e RestTemplate, e suporte para data binding de classes de dados do Kotlin.
Hoeller resumiu as outras caracteristicas notáveis do Spring 5.0 como:
O Framework Spring 5.0 suporta em nível de execução a API 8 do Java EE, exemplo: Servlet 4.0 para injeção de PushBuilder dentro dos métodos handler do Spring MVC, o padrão API JSON Binding para conversão JSON (com uma alternativa para Jackson e Gson), persistência JPA 2.2 e Bean Validation 2.0 para validações orientadas com anotações. Tudo que foi dito, nossa linha de base permanece no nível Java EE 7+, continua suportando o container Servlet 3.1, o provedor JPA 2.1, etc.