Spring Boot

Estrutura e prática Spring Boot framework

Resumo em construção
Voltar

Material complementar:


Spring Boot:

Camada que atua sob framework Spring, simplificando-o e modernizando-o, seguindo padrão MVC. Spring implementa padrão IoC (Inversion of Control), onde os objetos (Spring Beans / Beans) são instanciados automaticamente pelo container do Spring, dispensando criação manual. Instalar pré-requisitos (Ubuntu): sudo apt install -y default-jdk gradle maven


Padrão MVC:

  • Model: camada de modelo/negócios responsável por implementar regras de negócio da aplicação, definição das entidades e relacionamentos, implementando comportamento e camada de dados;
  • View: camada de visão, responsável pela implementação e exibição de interface com usuário;
  • Controller: camada de controle, classe OOP responsável pelo intermédio entre Model e View, pois elas nunca comunicam-se diretamente.
Fluxo:
  1. Controller recebe requisição HTTP;
  2. Controller trata dados da requisição, interagindo com Model (se necessário);
  3. Controller prepara/envia resposta HTTP ao cliente, geralmente invocando View para tal.
Spring Boot:

Recomenda-se separar camadas criando-as em diferentes pacotes, dentro do pacote principal.


Pacote Controller ficará em "projeto/src/main/java/pacotePrincipal/pacoteController"
Nome do pacotePrincipal: grupoExemplo.com.nomeProjeto
Nome do pacoteController: grupoExemplo.com.nomeProjeto.pacoteController

Estrutura:

  • raizProjeto/
    • src/: códigos do projeto
      • main/: arquivos para programar
        • java/: armazena pacote principal do projeto
          • pacotePrincipal.com/: pacote principal do projeto, aqui dentro ficam outros pacotes de controllers, com seus respectivos controllers (Arquivos.java)
            • NomeAplicacao.java: classe principal do pacote principal
        • resources/:
          • application.properties: variáveis de configuração do projeto
      • tests/: arquivos de testes unitários
    • build.gradle: dependências do projeto e testes
    • gradlew: executar servidor Gradle

Criar projeto Spring Boot:

Acesse o site Spring Initializr, e preencha os campos:

  1. Project: Gradle - Groovy
  2. Project Metadata
    • Group: grupoExemplo.com
    • Artifact: proj1
    • Name: proj1 (igual no Artifact)
    • Package name: grupoExemplo.com.proj1
  3. Java: versão do JDK instalado na máquina
  4. Dependencies:
    • DevTools
    • Spring Web
  5. Generate (o projeto será gerado)
  6. Extrair projeto localmente, abrir com editor, e executar terminal na pasta raíz do projeto (mesmo local do 'gradlew'): "./gradlew bootRun"
    • Quando a execução ficar em "80% EXECUTING", acesse em "http://localhost:8080"


Projeto 1: Controllers

Projeto para conhecimento de estrutura Spring Boot, e geração de controllers. Gerar projeto Spring Boot Gradle-Groovy, com dados:

  • Group: ubsocial.com
  • Artifact: proj1
  • Name: proj1
  • Package: ubsocial.com.proj1
  • Dependencies:
    • DevTools
    • Spring Web
  • Generate (projeto será gerado), extrair, e abrir com IntelliJ
  • No IntelliJ, dentro da pasta do pacote principal (ubsocial.com.proj1), criar pacote "controller": ubsocial.com.proj1.controller
  • Dentro do pacote "controller", criar controller (classe) "HelloController.java", com o conteúdo:
    
    package ubsocial.com.proj1.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @GetMapping("/hello")
        public String hello() {
            return "Hello World!";
        }
    
    }
    
  • Na mesma pasta de "gradlew", executar projeto: "./gradlew bootRun"
  • Dentro do pacote controller, criar pacote CalendarController (será classe CalendarController.java), com o conteúdo:
    
    package ubsocial.com.proj1.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class CalendarController {
    
        @GetMapping("/today")
        public String today() {
            return "Hoje é " + java.time.LocalDate.now();
        }
    
        @GetMapping("/tomorrow")
        public String tomorrow() {
            return "Amanhã é " + java.time.LocalDate.now().plusDays(1);
        }
    
    }
    
  • Na mesma pasta de "gradlew", executar projeto: "./gradlew bootRun"


Projeto 2: Models

Projeto de operadora telefônica, com objetivo de criar aplicação com Models e incorporar, em código, relacionamentos entre classes Java, conforme acima. Relacionamentos unidirecionais (agregação, composição), somente o todo (losango) conhece sua parte (linha com seta), então será criado dado na classe do todo, cujo nome é o nome do relacionamento apontando para parte. Gerar projeto Spring Boot Gradle-Groovy, com dados:

  • Group: ubsocial.com
  • Artifact: telefonia
  • Name: telefonia
  • Package: ubsocial.com.telefonia
  • Dependencies:
    • DevTools
    • Spring Web
  • Generate (projeto será gerado), extrair, e abrir com IntelliJ
  • No IntelliJ, dentro da pasta do pacote principal (ubsocial.com.telefonia), criar pacote "model": ubsocial.com.telefonia.model
  • Dentro do pacote "model", criar pacote de entidades "entity": ficará model.entity
  • Dentro do pacote "model.entity", criar Model (entidade) Operadora:
    
    package ubsocial.com.telefonia.model.entity;
    
    public class Operadora {
        private String nome;
    }
    
  • Dentro do pacote "model.entity", criar pacote "pessoal": ficará model.entity.pessoal
  • Dentro do pacote "pessoal", criar Model Cliente:
    
    package ubsocial.com.telefonia.model.entity.pessoal;
    
    public class Cliente {
        private String nome;
        private String endereco;
    }
    
  • Dentro do pacote "pessoal", criar Model ClientePessoaFisica:
    
    package ubsocial.com.telefonia.model.entity.pessoal;
    
    public class ClientePessoaFisica extends Cliente {
        private String cpf;
    }
    
  • Dentro do pacote "pessoal", criar Model ClientePessoaJuridica:
    
    package ubsocial.com.telefonia.model.entity.pessoal;
    
    public class ClientePessoaJuridica extends Cliente {
        private String cnpj;
    }
    
  • Dentro do pacote "model.entity", criar pacote "comercial": ficará model.entity.comercial
  • Dentro do pacote "comercial", criar Model Celular:
    
    package ubsocial.com.telefonia.model.entity.comercial;
    import ubsocial.com.telefonia.model.entity.pessoal.Cliente;
    import java.util.Set;
    
    public class Celular {
        private long numero;
        private Cliente cliente;
        private Set ligacoes;
        private Plano plano;
    }
    
  • Dentro do pacote "comercial", criar Model CelularPosPago:
    
    package ubsocial.com.telefonia.model.entity.comercial;
    
    public class CelularPosPago extends Celular {
        private int diaVencimento;
    }
    
  • Dentro do pacote "comercial", criar Model CelularPrePago:
    
    package ubsocial.com.telefonia.model.entity.comercial;
    import java.util.Date;
    
    public class CelularPrePago extends Celular {
        private double saldo;
        private Date dataDeValidade;
    }
    
  • Dentro do pacote "comercial", criar Model Ligacao:
    
    package ubsocial.com.telefonia.model.entity.comercial;
    import java.util.Date;
    
    public class Ligacao {
        private Date data;
        private int duracao;
    }
    
  • Dentro do pacote "comercial", criar Model Plano:
    
    package ubsocial.com.telefonia.model.entity.comercial;
    
    public class Plano {
        private String nome;
        private double valorPorMinuto;
    }
    

Elaborado por Mateus Schwede
ubsocial.github.io