Por que escolher o Spring como seu Java Framework?

Por que escolher o Spring como seu Java Framework?

1. Visão geral

Neste artigo, examinaremos a principal proposta de valor deSpring como uma das estruturas Java mais populares.

Mais importante, tentaremos entender as razões para o Spring ser nossa estrutura de escolha. Os detalhes da Spring e suas partes constituintes foramwidely covered in our previous tutorials. Portanto, vamos pular as partes introdutórias do "como" e nos concentrar principalmente nos "por que".

2. Por que usar qualquer estrutura?

Antes de começarmos qualquer discussão em particular no Spring, vamos primeiro entender por que precisamos usar qualquer estrutura em primeiro lugar.

Ageneral purpose programming language like Java is capable of supporting a wide variety of applications. Sem mencionar que o Java está sendo trabalhado ativamente e melhorando a cada dia.

Além disso, existem inúmeras bibliotecas de código aberto e proprietárias para oferecer suporte a Java nesse sentido.

Então, por que precisamos de uma estrutura, afinal? Honestamente, não é absolutamente necessário usar uma estrutura para realizar uma tarefa. Mas, muitas vezes é aconselhável usar um por vários motivos:

  • Nos ajudafocus on the core task rather than the boilerplate associados a ele

  • Reúne anos de sabedoria na forma de padrões de design

  • Ajuda-nos a aderir aos padrões regulamentares e do setor

  • Reduz o custo total de propriedade do aplicativo

Acabamos de arranhar a superfície aqui e devemos dizer que os benefícios são difíceis de ignorar. Mas nem tudo pode ser positivo, então qual é o truque:

  • Força-nos awrite an application in a specific manner

  • Vincula-se a uma versão específica de idioma e bibliotecas

  • Adiciona à pegada de recursos do aplicativo

Francamente, não há balas de prata no desenvolvimento de software e as estruturas certamente não são exceção a isso. Portanto, a escolha de qual estrutura ou nenhuma deve ser orientada a partir do contexto.

Esperançosamente, estaremos melhor posicionados para tomar essa decisão com relação ao Spring em Java até o final deste artigo.

3. Breve visão geral do ecossistema de molas

Antes de começarmos nossa avaliação qualitativa do Spring Framework, vamos dar uma olhada mais de perto em como é o ecossistema do Spring.

Spring came into existence somewhere in 2003 em um momento em que o Java Enterprise Edition estava evoluindo rapidamente e o desenvolvimento de um aplicativo corporativo era empolgante, mas mesmo assim tedioso!

A primavera começou comoan Inversion of Control (IoC) container for Java. Ainda relacionamos o Spring principalmente a ele e, de fato, ele forma o núcleo da estrutura e outros projetos que foram desenvolvidos sobre ela.

3.1. Spring Framework

O framework Spring édivided into modules, o que torna muito fácil escolher as partes para usar em qualquer aplicativo:

  • 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 a API Servlet (Spring MVC) e a API recentemente reativa (Spring WebFlux), e também oferece suporte a 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 de unidade e integração através de objetos simulados, acessórios de teste, gerenciamento de contexto e cache

3.2. Projetos de Primavera

Mas o que torna o Spring muito mais valioso éa strong ecosystem that has grown around it over the years and that continues to evolve actively. Eles são estruturados comoSpring projects que são desenvolvidos no topo da estrutura Spring.

Embora a lista de projetos do Spring seja longa e continue mudando, há alguns que merecem destaque:

  • Boot: nos fornece um conjunto de modelos altamente opinativos, mas extensíveis, para criar vários projetos baseados no Spring em quase nenhum momento. Facilita a criação de aplicativos Spring independentes com o Tomcat incorporado ou um contêiner semelhante.

  • Cloud: fornece suporte para desenvolver facilmente alguns dos padrões comuns de sistema distribuído, como descoberta de serviço, disjuntor e gateway de API. Isso nos ajuda a reduzir o esforço para implantar esses padrões padrão em plataformas locais, remotas ou mesmo gerenciadas.

  • Security: fornece um mecanismo robusto para desenvolver autenticação e autorização para projetos baseados no Spring de uma maneira altamente personalizá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, suporta o gerenciamento de exibição com reconhecimento de dispositivo para uma ótima experiência do usuário, gerenciamento de preferências do site e alternador de sites.

  • Batch: fornece uma estrutura leve para o desenvolvimento de aplicativos em lote para sistemas corporativos, como arquivamento de dados. Possui suporte intuitivo para agendar, reiniciar, pular, coletar métricas e registrar. Além disso, suporta a expansão para trabalhos de alto volume por meio de otimização e particionamento.

Escusado será dizer que esta é uma introdução bastante abstrata ao que a Spring tem a oferecer. Mas isso nos fornece terreno suficiente com relação à organização e amplitude do Spring para levar nossa discussão adiante.

4. Primavera em Ação

É habitual adicionar um programa olá mundo para entender qualquer nova tecnologia.

Vamos ver comoSpring can make it a cakewalk to write a program which does more than just hello-world. Criaremos um aplicativo que exporá as operações CRUD como APIs REST para uma entidade de domínio como Funcionário, apoiada por um banco de dados na memória. Além do mais, protegeremos nossos endpoints de mutação usando autenticação básica. Por fim, nenhum aplicativo pode realmente ser concluído sem bons e antigos testes de unidade.

4.1. Configuração do Projeto

Vamos configurar nosso projeto Spring Boot usandoSpring Initializr, que é uma ferramenta online conveniente para inicializar projetos com as dependências certas. Adicionaremos Web, JPA, H2 e Security como dependências do projeto para definir a configuração do Maven corretamente.

Maisdetails on 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 oEmployee como uma entidade JPA simples:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    // Standard constructor, getters and setters
}

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 muito simples:

public interface EmployeeRepository
  extends CrudRepository {
    List findAll();
}

Tudo o que precisamos fazer é definir uma interface como esta eSpring JPA will provide us with an implementation fleshed out with default and custom operations. Bastante limpo! Encontre mais detalhes sobreworking with Spring Data JPA em nossos outros artigos.

4.3. Controlador

Agora temos que definir um controlador da web para rotear e manipular nossas solicitações recebidas:

@RestController
public class EmployeeController {
    @Autowired
    private EmployeeRepository repository;
    @GetMapping("/employees")
    public List getEmployees() {
        return repository.findAll();
    }
    // Other CRUD endpoints handlers
}

Na verdade, tudo o que tivemos que fazer foiannotate the class and define routing meta information junto com cada método de tratamento.

Trabalhar comSpring REST controllers é coberto com grandes detalhes em nosso artigo anterior.

4.4. Segurança

Então, definimos tudo agora, mas e quanto a operações de segurança, como criar ou excluir funcionários? Não queremos acesso não autenticado a esses endpoints!

O Spring Security realmente brilha nesta área:

@EnableWebSecurity
public class WebSecurityConfig
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http)
      throws Exception {
        http
          .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/employees", "/employees/**")
            .permitAll()
          .anyRequest()
            .authenticated()
          .and()
            .httpBasic();
    }
    // other necessary beans and definitions
}

more details here which require attention para entender, mas o ponto mais importante a se observar éthe declarative manner in which we have only allowed GET operations unrestricted.

4.5. Teste

Agora fizemos tudo, mas espere, como testamos isso?

Vejamos se o Spring pode facilitar a escrita de testes de unidade para controladores REST:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerTests {
    @Autowired
    private MockMvc mvc;
    @Test
    @WithMockUser()
    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,Spring provides us with the necessary infrastructure to write simple unit and integration tests que de outra forma dependem do contexto do Spring para ser inicializado e configurado.

4.6. Executando o aplicativo

Por fim, como executamos esse aplicativo? Esse é outro aspecto interessante do Spring Boot. Embora possamos empacotar isso como um aplicativo regular e implantar tradicionalmente em um contêiner de Servlet.

Mas onde é divertido isso! Spring Boot comes with an embedded Tomcat server:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Essa é uma classe que é pré-criada como parte da auto-inicialização e possui todos os detalhes necessários para iniciar esse aplicativo usando o servidor incorporado.

5. Alternativas ao Spring

Embora optar por usar uma estrutura seja relativamente mais fácil, a escolha entre estruturas pode ser assustadora com as escolhas que temos. Mas, para isso, precisamos ter pelo menos uma compreensão aproximada de quais alternativas existem para os recursos que o Spring tem a oferecer.

Como discutimos anteriormente,the Spring framework together with its projects offer a wide choice for an enterprise developer to pick from. Se fizermos uma avaliação rápida dos frameworks Java contemporâneos, eles nem chegam perto do ecossistema que o Spring nos oferece.

No entanto, para áreas específicas, eles formam 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

Além disso, existem algumas adições recentes que oferecem suporte mais amplo que um domínio específico, mas ainda não cobrem tudo o que o Spring tem a oferecer:

  • Micronaut: uma estrutura baseada em JVM adaptada para microsserviços nativos da nuvem

  • Quarkus: uma pilha Java da nova era que promete oferecer um tempo de inicialização mais rápido e uma pegada menor

Obviamente, não é necessário nem viável iterar completamente a lista, mas temos uma ideia geral aqui.

6. Então, por que escolher a primavera?

Por fim, criamos todo o contexto necessário para abordar nossa questão central, por que o Spring? Entendemos as maneiras pelas quais uma estrutura pode nos ajudar no desenvolvimento de aplicativos corporativos complexos.

Além disso, entendemos as opções que temos para questões específicas como web, acesso a dados, integração em termos de estrutura, especialmente para Java.

Agora, onde brilha a primavera entre todas essas coisas? Vamos explorar.

6.1. Usabilidade

Um dos principais aspectos da popularidade de qualquer estrutura é o quão fácil é para os desenvolvedores usá-la. Múltiplas opções de configuração e convenção sobre configuração torna-oreally easy for developers to start and then configure exactly what they need.

Projetos comoSpring Boot have made bootstrapping a complex Spring project almost trivial. Sem mencionar, possui excelente documentação e tutoriais para ajudar qualquer pessoa a entrar no sistema.

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, podemosoptionally include one or more Spring projects 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 Springdoes not support all of Java EE specifications, it supports all of its technologies, muitas vezes melhorando o suporte sobre a especificação padrão quando necessário. Por exemplo, o Spring suporta repositórios baseados em JPA e, portanto, facilita a troca de fornecedores.

Além disso, o Spring oferece suporte a especificações do setor comoReactive Stream em Spring Web Reactive e HATEOAS emSpring HATEOAS.

6.4. Testabilidade

A adoção de qualquer estrutura depende em grande parte do fato de como é fácil testar o aplicativo construído sobre ela. Mola no núcleoadvocates and supports Test Driven Development (TDD).

A aplicação de mola é composta principalmente por POJOs, o que naturalmente torna o teste de unidade relativamente mais simples. No entanto, o Spring fornece Mock Objects para cenários como MVC, onde o teste de unidade fica complicado de outra maneira.

6.5 Maturity

A primavera tem uma longa história de inovação, adoção e padronização. Com o passar dos anos, tornou-semature enough to become a default solution for most common problems enfrentado no desenvolvimento de aplicativos empresariais em grande escala.

O que é ainda mais emocionante é o quão ativamente ele está sendo desenvolvido e mantido. O suporte a novos recursos de idiomas e soluções de integração corporativa estão sendo desenvolvidos todos os dias.

6.6. Suporte da comunidade

Por último, mas não menos importante, qualquer estrutura ou mesmo biblioteca sobrevive à indústria por meio da inovação e não há lugar melhor para a inovação do que a comunidade. Spring é um código abertoled by Pivotal Software and backed by a large consortium of organizations and individual developers.

Isso significa que ele permanece contextual e frequentemente futurista, como é evidente pelo número de projetos sob seu guarda-chuva.

7. RazõesNot para usar a primavera

Existe uma grande variedade de aplicativos que podem se beneficiar de um nível diferente de uso do Spring, e isso muda tão rapidamente quanto o Spring está crescendo.

No entanto, devemos entender que o Spring, como qualquer outra estrutura, é útil no gerenciamento da complexidade do desenvolvimento de aplicativos. Isso nos ajuda a evitar armadilhas comuns e mantém o aplicativo sustentável, à medida que cresce com o tempo.

Estecomes at the cost of an additional resource footprint and learning curve, por menor que seja. Se existe realmente um aplicativo bastante simples e que não se espera que fique complexo, talvez seja mais benéfico não usar nenhuma estrutura!

8. Conclusão

Neste artigo, discutimos os benefícios do uso de uma estrutura no desenvolvimento de aplicativos. Discutimos ainda mais brevemente o Spring Framework, em particular.

Ainda sobre o assunto, também analisamos algumas das estruturas alternativas disponíveis para Java.

Finalmente, discutimos os motivos que podem nos levar a escolher o Spring como o framework de escolha para Java.

Devemos terminar este artigo com uma nota de conselho, no entanto. Por mais atraente que possa parecer,there is usually no single, one-size-fits-all solution no desenvolvimento de software.

Portanto, devemos aplicar nossa sabedoria na seleção das soluções mais simples para os problemas específicos que pretendemos resolver.