1. Visão Geral
Neste artigo, examinaremos a principal proposta de valor do Spring como um dos frameworks Java mais populares.
Mais importante ainda, tentaremos entender as razões do Spring ser nossa estrutura preferida. Detalhes do Spring e suas partes constituintes foram amplamente abordados em nossos tutoriais anteriores . Portanto, pularemos as partes introdutórias do “como” e nos concentraremos principalmente nos “porquês”.
2. Por que usar um framework?
Antes de começarmos qualquer discussão em particular sobre o Spring, vamos primeiro entender por que precisamos usar um framework.
Uma linguagem de programação de uso geral como Java é capaz de suportar uma ampla variedade de aplicações. Sem mencionar que o Java está sendo trabalhado ativamente e melhorando a cada dia.
Além disso, existem inúmeras bibliotecas proprietárias e open-source para oferecer suporte ao Java nesse sentido.
Então, por que precisamos de um framework, afinal? Honestamente, não é absolutamente necessário usar um framework para realizar uma tarefa. Mas muitas vezes é aconselhável usar um por vários motivos:
- Nos ajuda a focar na tarefa principal, e não no padrão associado a ela
- Reúne anos de sabedoria na forma de padrões de design
- Nos ajuda a aderir aos padrões regulatórios e tanto do java quando de padrões de internet
- Reduz o custo total de propriedade do aplicativo
Acabamos de falar apenas superficialmente aqui e devemos dizer que os benefícios são difíceis de ignorar. Mas nem tudo pode ser positivo, então qual é o problema:
- Nos obriga a escrever um aplicativo de uma maneira específica
- Deixa travado a uma versão específica de linguagem e bibliotecas (lock-in)
- Aumenta a pegada de recursos do aplicativo (componentes, bibliotecas e outras coisas que acabam indo na mochila)
Espero que estaremos em melhor posição para tomar essa decisão em relação ao Spring até o final deste artigo.
3. Breve Visão Geral do Ecossistema Primavera
Antes de começarmos nossa avaliação qualitativa do Spring Framework, vamos dar uma olhada mais de perto em como é o ecossistema Spring.
O Spring surgiu em 2003, numa época em que o Java Enterprise Edition estava evoluindo rapidamente e o desenvolvimento de um aplicativo corporativo era empolgante, mas ainda assim tedioso!
O Spring começou como um contêiner de Inversão de Controle (IoC) para Java. Ainda relacionamos o Spring principalmente com ele e, na verdade, ele constitui o núcleo do framework e de outros projetos que foram desenvolvidos em cima dele.
3.1. Estrutura Primavera
O framework Spring é dividido em módulos, o que torna muito fácil escolher as partes para usar em qualquer aplicação:- Core : Fornece recursos básicos como DI (Injeção de Dependência), Internacionalização, Validação e AOP (Programação Orientada a Aspectos)
- Data Access : suporta acesso a dados por meio de JTA (Java Transaction API), JPA (Java Persistence API) e JDBC (Java Database Connectivity)
- Web : Suporta API Servlet ( Spring MVC ) e recentemente Reactive API ( Spring WebFlux ) e, adicionalmente, suporta WebSockets, STOMP e WebClient
- Integration : Suporta integração com Enterprise Java por meio de JMS (Java Message Service), JMX (Java Management Extension) e RMI (Remote Method Invocation)
- Testing : amplo suporte para testes unitários e de integração por meio de objetos simulados, acessórios de teste, gerenciamento de contexto e cache
3.2. Projetos do Spring
Mas o que torna o Spring muito mais valioso é um ecossistema forte que cresceu em torno dele ao longo dos anos e que continua a evoluir ativamente . Eles são estruturados como projetos Spring que são desenvolvidos com base na estrutura do Spring.Embora a lista de projetos Spring seja longa e esteja sempre mudando, há alguns que vale a pena mencionar:
- Boot : nos fornece um conjunto de modelos altamente opinativos, mas extensíveis, para criar vários projetos baseados no Spring em quase nenhum momento. Isso torna muito fácil criar aplicativos Spring independentes com Tomcat incorporado ou um contêiner semelhante.
- Cloud : fornece suporte para desenvolver facilmente alguns dos padrões comuns de sistemas distribuídos, como descoberta de serviço, disjuntor e gateway de API. Isso nos ajuda a reduzir o esforço para implantar esses padrões padronizados em plataformas locais, remotas ou mesmo gerenciadas.
- Security : Fornece um mecanismo robusto para desenvolver autenticação e autorização para projetos baseados em Spring de maneira altamente customizável. Com suporte declarativo mínimo, obtemos proteção contra ataques comuns, como fixação de sessão, click-jacking e falsificação de solicitação entre sites.
- Mobile : fornece recursos para detectar o dispositivo e adaptar o comportamento do aplicativo de acordo. Além disso, oferece suporte ao gerenciamento de visualização com reconhecimento de dispositivo para uma experiência de usuário ideal, gerenciamento de preferências de site e alternador de site.
- Batch : fornece uma estrutura leve para o desenvolvimento de aplicativos em lote para sistemas corporativos, como arquivamento de dados. Possui suporte intuitivo para scheduling, reinicialização, skipping, coleta de métricas e logging. Além disso, oferece suporte à expansão para trabalhos de alto volume por meio de otimização e particionamento.
4. O Spring em ação
É comum adicionar um programa hello-world para entender qualquer nova tecnologia.
Vamos ver como o Spring pode tornar fácil escrever um programa que faça mais do que apenas hello-world . Criaremos um aplicativo que vai expor as operações CRUD como APIs REST para uma entidade de domínio como Employee, apoiada por um banco de dados na memória. Além do mais, protegeremos nossos endpoints de mutação usando autenticação básica. Finalmente, nenhum aplicativo pode realmente ser completo sem o bom e velho teste unitário.
4.1. Configuração do projeto
Configuraremos nosso projeto Spring Boot usando Spring Initializr , que é uma ferramenta online conveniente para inicializar projetos com as dependências corretas. Adicionaremos Web, JPA, H2 e security como dependências do projeto para obter a configuração do Maven corretamente.
Mais detalhes sobre bootstrapping estão disponíveis em um de nossos artigos anteriores.
4.2. Modelo de Domínio e Persistência
Com tão pouco a ser feito, já estamos prontos para definir nosso modelo de domínio e persistência.
Vamos primeiro definir o Funcionário como uma entidade JPA simples:
Observe o ID gerado automaticamente que incluímos em nossa definição de entidade.
Agora temos que definir um repositório JPA para nossa entidade. É aqui que o Spring torna tudo realmente simples:
public interface EmployeeRepository extends CrudRepository<Employee, Long> { List<Employee> findAll(); }
Tudo o que precisamos fazer é definir uma interface como esta, e o Spring JPA nos fornecerá uma implementação desenvolvida com operações padrão e personalizadas . Muito legal! Encontre mais detalhes sobre como trabalhar com Spring Data JPA em nossos outros artigos.
4.3. O Controller
Agora temos que definir um controlador web para rotear e tratar nossas solicitações recebidas:
public class EmployeeController { private EmployeeRepository repository; public List<Employee> getEmployees() { return repository.findAll(); } // Other CRUD endpoints handlers }
Na verdade, tudo o que tivemos que fazer foi anotar a classe e definir meta-informações de roteamento junto com cada método manipulador.
4.4. Security
Já definimos tudo, mas e quanto à segurança de operações como criar ou excluir funcionários? Não queremos acesso não autenticado a esses terminais!
Spring Security realmente brilha nesta área:
Há mais detalhes aqui que requerem atenção para serem entendidos, mas o ponto mais importante a ser observado é a maneira declarativa pela qual permitimos apenas operações GET irrestritas.
4.5. Testing
Agora já fizemos tudo, mas espere, como testamos isso?
Vamos ver se o Spring pode facilitar a escrita de testes unitários para controllers REST:
public class EmployeeControllerTests { private MockMvc mvc; public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception { mvc.perform(post("/employees").content( new ObjectMapper().writeValueAsString(new Employee("First", "Last")) .with(csrf())) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status() .isCreated()) .andExpect(jsonPath("$.firstName", is("First"))) .andExpect(jsonPath("$.lastName", is("Last"))); } // other tests as necessary }
Como podemos ver, o Spring nos fornece um framework básico para escrever testes simples de unidade e integração que, de outra forma, dependem do contexto do Spring para serem inicializados e configurados.
4.6. Rodando a aplicação
Finalmente, como executamos este aplicativo? Este é outro aspecto interessante do Spring Boot. Embora possamos empacotar isso como um aplicativo normal e implantar tradicionalmente em um contêiner Servlet.
Mas qual a graça de fazer dessa forma? O Spring Boot vem com um servidor Tomcat incorporado :
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Esta é uma classe que vem pré-criada como parte do bootstrap e possui todos os detalhes necessários para iniciar esta aplicação utilizando o servidor embarcado.
Além disso, isso é altamente personalizável .
5. Alternativas ao Spring
Embora escolher usar uma estrutura seja relativamente mais fácil, escolher entre estruturas muitas vezes pode ser assustador com as escolhas que temos. Mas para isso, devemos ter pelo menos uma compreensão aproximada de quais alternativas existem para os recursos que o Spring tem a oferecer.
Como discutimos anteriormente, a estrutura Spring, juntamente com seus projetos, oferece uma ampla escolha para um desenvolvedor corporativo escolher . Se fizermos uma avaliação rápida dos frameworks Java contemporâneos, eles não chegam nem perto do ecossistema que o Spring nos fornece.
No entanto, para áreas específicas, constituem um argumento convincente para escolher como alternativas:
- Guice : oferece um contêiner IoC robusto para aplicativos Java
- Play : se encaixa perfeitamente como uma estrutura da Web com suporte reativo
- Hibernate : Uma estrutura estabelecida para acesso a dados com suporte JPA
- Micronaut : uma estrutura baseada em JVM adaptada para microsserviços nativos da nuvem
- Quarkus : uma pilha Java da nova era que promete oferecer tempo de inicialização mais rápido e ocupar menos espaço
6. Então, por que escolher o Spring?
Finalmente, construímos todo o contexto necessário para abordar a nossa questão central, porquê o Spring? Compreendemos como uma estrutura pode nos ajudar no desenvolvimento de aplicativos empresariais complexos.Além disso, entendemos as opções que temos para preocupações específicas como web, acesso a dados, integração em termos de framework, especialmente para Java.
Agora, onde brilha o Spring entre tudo isto? Vamos explorar.
6.1. Usabilidade
Um dos principais aspectos da popularidade de qualquer framework é a facilidade de uso dos desenvolvedores. O Spring através de múltiplas opções de configuração e Convenção sobre Configuração torna muito fácil para os desenvolvedores iniciarem e configurarem exatamente o que precisam.Projetos como o Spring Boot tornaram o a configuração inicial de um projeto complexo do Spring quase que trivial. Sem falar que possui excelente documentação e tutoriais para ajudar qualquer pessoa a iniciar.
6.2. Modularidade
Outro aspecto importante da popularidade do Spring é sua natureza altamente modular. Temos opções para usar todo o framework Spring ou apenas os módulos necessários. Além disso, podemos opcionalmente incluir um ou mais projetos Spring dependendo da necessidade.Além do mais, temos a opção de usar outros frameworks como Hibernate ou Struts também!
6.3. Conformidade
Embora o Spring não suporte todas as especificações do Jakarta EE, ele suporta todas as suas tecnologias , muitas vezes melhorando o suporte em relação à especificação padrão quando necessário. Por exemplo, Spring oferece suporte a repositórios baseados em JPA e, portanto, torna trivial a troca de provedor.Além disso, o Spring oferece suporte a especificações do setor, como Reactive Stream no Spring Web Reactive e HATEOAS no Spring HATEOAS.
6.4. Testabilidade
A adoção de qualquer estrutura também depende em grande parte da facilidade de testar o aplicativo construído sobre ela. Spring at the core defende e apoia o Desenvolvimento Orientado a Testes (TDD).Uma aplicação Spring é composta principalmente de POJOs, o que naturalmente torna o teste de unidade relativamente mais simples. No entanto, o Spring fornece Mocks para cenários como MVC, onde o teste de unidade fica complicado.
6.5. A Maturidade
O Spring tem uma longa história de inovação, adoção e padronização. Com o passar dos anos, ele amadureceu o suficiente para se tornar uma solução padrão para a maioria dos problemas comuns enfrentados no desenvolvimento de aplicativos empresariais em larga escala.O que é ainda mais desafiador é o quão ativamente ele está sendo desenvolvido e mantido. O suporte para novos recursos de linguagem e soluções de integração empresarial são desenvolvidos todos os dias.
6.6. Suporte da comunidade
Por último, mas não menos importante, qualquer estrutura ou mesmo biblioteca sobrevive à indústria através da inovação e não há lugar melhor para a inovação do que a comunidade. Spring é um código aberto liderado pela Pivotal Software e apoiado por um grande consórcio de organizações e desenvolvedores individuais.Isto significa que permanece contextual e muitas vezes futurista, como é evidente pelo número de projetos de baixo do seu guarda-chuva.
7. Razões para não usar o Spring
Há uma grande variedade de aplicativos que podem se beneficiar de um nível diferente de uso do Spring, e isso está mudando tão rápido quanto o Spring cresce.
No entanto, devemos entender que o Spring, como qualquer outro framework, é útil no gerenciamento da complexidade do desenvolvimento de aplicações. Isso nos ajuda a evitar armadilhas comuns e mantém o aplicativo passível de manutenção à medida que cresce com o tempo.\
Isso entra como um custo de se preocupar com a manutenção e evolução do framework e uma curva de aprendizado do spring, por menor que seja. Se realmente existe um aplicativo que é simples o suficiente e não se espera que se torne complexo, talvez seja mais benéfico não usar nenhum framework!
8. Conclusão
Neste artigo, discutimos os benefícios de usar um framework no desenvolvimento de aplicativos. Discutimos brevemente o Spring Framework em particular.Ainda no assunto, também examinamos alguns dos frameworks alternativos disponíveis para Java.
Por fim, discutimos os motivos que podem nos levar a escolher Spring como framework preferido para Java.
Devemos terminar este artigo com um conselho. Por mais atraente que possa parecer, geralmente não existe uma solução única e que sirva para todos no desenvolvimento de software.
Portanto, devemos aplicar nosso conhecimento na escolha das soluções mais simples para os problemas específicos que pretendemos resolver.
Este post foi escrito pelo blog https://www.baeldung.com/ e adaptado para Português por Fabio Pereira, arquiteto sênior de soluções.
link do artigo : https://www.baeldung.com/spring-why-to-choose

Nenhum comentário:
Postar um comentário