Se você está estudando ou trabalha com Java, já deve ter ouvido falar sobre o Spring. O Spring é um dos frameworks Java mais conhecidos e utilizados. Trata-se de um ecossistema de desenvolvimento que facilita a criação de aplicações Java utilizando diversos módulos independentes.
O projeto do Spring cresceu tanto em meio aos desenvolvedores, que ele foi modularizado: agora cada módulo tem a sua especialidade.
Dentre os principais módulos podemos citar:
-
Spring Boot: facilita a configuração e publicação das aplicações desenvolvidas, visando reduzir a quantidade de configurações iniciais que geralmente são fundamentais em projetos Java;
-
Spring Data: Módulo do Spring que visa facilitar a forma de acesso aos dados por parte da aplicação. Possui suporte desde o JDBC até o JPA;
-
Spring MVC: Permite a criação e desenvolvimento de aplicações utilizando o padrão MVC;
-
Spring Security: Módulo do Spring responsável por gerenciar toda a parte de autenticação e autorização de uma aplicação.
Spring Boot
O Spring Boot é um framework que torna fácil a criação de aplicações Spring auto suficientes e robustas, possibilitando a execução imediata.
Contudo, isso só é possível por conta da abordagem opinativa sobre a plataforma Spring e bibliotecas de terceiros, que permite ao desenvolvedor gastar o mínimo de tempo possível configurando o projeto, e sim codificando suas regras de negócio.
Não vamos adentrar muito no Spring Boot aqui, pois já temos um artigo explicando o que é o Spring Boot. Ele está bem completo, dá uma conferida :)
Spring Web MVC
O Spring MVC é um framework que nos auxilia no desenvolvimento de aplicações web. Com ele, nós conseguimos ter facilidade e flexibilidade para trabalhar com requisições web.
O Spring MVC é uma excelente implementação do padrão MVC. Já temos aqui no blog um post específico sobre o padrão MVC, mas de forma resumida, MVC (acrônimo para Model-View-Controller) sugere uma maneira para você pensar na divisão de responsabilidades, principalmente dentro de um software web, dividindo as camadas em model, view, controller. Com ele podemos separar o código relativo à interface do usuário das regras de negócio.
Ele já possui as principais funcionalidades que precisamos para o desenvolvimento: atender as requisições HTTP, delegar responsabilidades de processamento de dados para outros componentes e preparar as respostas HTTP.
O Spring MVC trabalha de forma síncrona, ou seja, processa requisições uma a uma, por ordem de chegada. Enquanto uma requisição não for finalizada, ele não processa a seguinte.
O Spring MVC, assim como vários outros frameworks Java trabalha com Servlets, que trabalha ou de modo síncrono (versão anterior ao Servlet 3), ou de modo assíncrono (versão a partir do Servlet 3).
Spring WebFlux
O Spring Webflux permite trabalharmos com programação reativa em uma aplicação java web dentro do Spring. Ele trabalha de forma reativa, assíncrona. Veio da necessidade das requisições serem processadas paralelamente, ou seja, sem bloqueio para lidar com a simultaneidade com um número de threads e escalar com menos recursos de hardware.
O Spring Webflux utiliza como principal biblioteca o Reactor, que possui 2 tipos de API:
- mono: utilizado quando você tem operações com 1 dado, por exemplo, caso eu vá pesquisar um cliente específico no banco de dados
- flux: maiores dados, por exemplo, se eu precisar de uma lista de clientes de uma determinada loja.
Testes no Spring
A adoção da abordagem de desenvolvimento orientado a testes (TDD) no desenvolvimento de software é defendida pelo Spring e, portanto, a cobertura do suporte do Spring para testes de integração é coberta, juntamente com as melhores práticas para testes de unidade.
O Spring Framework fornece suporte de primeira classe para testes de integração no módulo spring-test.
Este teste não depende de um servidor de aplicativos ou outro ambiente de implementação. Ele é fornecido na forma de Spring TestContext Framework orientado por anotações.
Segundo a documentação do Spring, o suporte de teste de integração tem os seguintes objetivos principais:
- Para gerenciar o armazenamento em cache do contêiner Spring IoC entre os testes;
- Para fornecer injeção de dependência de instâncias de fixture de teste;
- Para fornecer gerenciamento de transações apropriado para testes de integração;
- Para fornecer classes básicas específicas do Spring que auxiliam os desenvolvedores na escrita de testes de integração.
Acesso a dados
Provavelmente sua aplicação terá que se conectar com banco de dados. O Spring MVC não te dá a funcionalidade para se conectar ao banco, nem realizar operações. Por isso, temos o Spring Data.
O Spring Data permite que trabalhemos com facilidades usando bancos de dados, facilitando nosso trabalho com persistência de dados, onde ele unifica e facilita o acesso a diferentes tecnologias de armazenamento de dados, como bancos de dados relacionais e não relacionais (NoSQL).
O Spring Data contém vários subprojetos para acesso de dados em diferentes modelos de bancos de dados. Todos eles suportam aspectos como uso de templates, mapeamento de objetos e suporte a repositórios. A seguir veremos alguns deles.
Spring Data JPA
Este projeto facilita a criação de repositórios, sendo responsável por sua implementação, ou seja, da camada de persistência de dados, oferecendo funcionalidades para o acesso ao banco de dados.
Basicamente, ele adiciona uma camada extra sobre o JPA Provider, onde este módulo contém uma camada chamada Repositórios (JpaRepository). Essa camada dá suporte à criação de repositórios estendendo as interfaces do Spring Data.
Spring Data JDBC
Facilita a implementação de repositórios baseados em JDBC. Ele tem um suporte para camadas de acesso a dados baseadas em JDBC. Como ele tem o propósito de ser conceitualmente fácil, isso o torna um pouco mais simples e limitado do que o Spring JPA. Porém, ele possui boas características como CRUD personalizáveis, suporte para anotações, consultas e eventos.
Spring Data MongoDB
Fornece suporte à persistência de dados com o banco de dados MongoDB, tendo como característica o suporte a persistência de dados não estruturados. Ele também fornece métodos básicos para armazenamento e recuperação de documentos.
Spring Data Neo4J
Este módulo cuida da persistência de dados gráficos Neo4j, fornecendo fácil configuração e acesso ao banco de dados. Esse banco se trata de um banco de dados orientado a grafos. O Spring Data Neo4j é uma parte do projeto Spring Data que fornece acesso conveniente aos dados para bancos de dados NoSQL.
Existem mais módulos do Spring Data para suporte a outros bancos como o Spring Data Redis, por exemplo. De todos eles, o mais utilizado é o Spring Data JPA.
Integrações
Cada módulo do Spring framework nos ajuda a fazer integrações. Vamos citar aqui dois exemplos.
-
Enviar e-mail: Com o Spring Boot você pode configurar o envio de e-mails em projetos de maneira bem fácil, utilizando um serviço chamado Mailtrap. Mailtrap é uma ferramenta gratuita para testar envio de e-mails, sendo o mais ideal para testar aplicativos. Você pode inclusive enviar e-mails em formato HTML.
-
Tarefas: No decorrer do desenvolvimento, você pode precisar implementar algumas tarefas. Algumas são simples e rápidas, outras mais complexas e demoradas. Para lidar com isso, foi criado o framework Spring Batch, que é um dos mais usados na implementação de aplicações. O Spring Batch veio para facilitar o processo de criação de jobs. Um job é uma máquina de estados com sequência de etapas. Assim, para atender a diversos cenários, ele conta com uma série de features que permitem a elaboração de uma solução, atendendo aos seus requisitos funcionais e não funcionais.
Spring Core
O core é o centro da aplicação. No Spring, o core é responsável por criar os objetos, conectá-los, configurá-los e gerenciar seu ciclo de vida completo, desde a criação até a destruição. No Spring, o core é dividido em quatro componentes: Core, Beans, Expression Language (SpEL) e Context.
Injeção de dependências
Inversão de Controle (IoC), também conhecido como injeção de dependência, é um processo pelo qual os objetos definem suas dependências, ou seja, os outros objetos com os quais trabalham, apenas por meio de argumentos do construtor, argumentos para um método de fábrica ou propriedades que são definidas na instância do objeto depois que ele é construído ou retornado.
Eventos
Os eventos são uma das funcionalidades mais úteis no framework e é um dos recursos fornecidos pelo ApplicationContext. Para a criação de eventos, é necessário seguir algumas diretrizes, como:
- o evento deve estender ApplicationEvent
- o editor deve injetar um objeto ApplicationEventPublisher
- o ouvinte deve implementar a interface ApplicationListener
O Spring também permite criar e publicar eventos personalizados. Estes eventos são síncronos, o que nos traz algumas vantagens.
Validação, vinculação de dados e conversão de tipo
A validação não deve estar vinculada à camada da web, deve ser de fácil localização e deve ser possível conectar qualquer validador disponível. Sendo assim, o Spring criou o “Validator”: uma interface básica e utilizável em todas as camadas de um aplicativo.
Já para a vinculação de dados temos o DataBinder. Ele é muito útil para permitir que a entrada do usuário seja dinamicamente vinculada ao modelo de domínio ou qualquer objeto usado para processar a entrada do usuário. O Validator e o DataBinder compõem o pacote “Validation”.
Para conversão de tipo, o Spring apresenta o pacote “core.convert”. Ele fornece um recurso de conversão de tipo geral, bem como um pacote de “formato” de nível superior para formatar valores de campo. Esses novos pacotes podem ser usados como alternativas mais simples aos PropertyEditors, também utilizados para analisar e formatar valores de propriedade.