🍃 Capítulo 01: Introdução ao Spring Boot 3+, Inversão de Controle e REST APIs

🎯 Objetivos da Aula

Ao final desta aula, você será capaz de:

  1. Compreender a função do Spring Boot 3+ no desenvolvimento de microserviços e REST APIs em Java 17+.
  2. Entender os conceitos de Inversão de Controle (IoC) e Injeção de Dependências (DI).
  3. Criar uma aplicação backend executável com servidor web Apache Tomcat embutido.
  4. Construir o primeiro endpoint HTTP RESTful utilizando as anotações @RestController e @GetMapping.

🧠 1. O que é o Spring Boot 3+?

O Spring Boot é um framework opinativo construído sobre o ecossistema Spring que elimina a necessidade de configurações complexas em arquivos XML ou servidores de aplicação externos (como GlassFish ou WildFly).

flowchart TD
    subgraph SpringBootApp ["Aplicação Spring Boot 3+ (JAR Auto-contido)"]
        IoC["Containers de Inversão de Controle (Spring IoC Context)"]
        EmbeddedTomcat["🖥️ Servidor Apache Tomcat Embutido (Porta 8080)"]
        RestController["⚙️ RestControllers (@GetMapping, @PostMapping)"]
        
        IoC --> RestController & EmbeddedTomcat
    end
    
    Client["📱 Cliente Web / App Mobile"] -->|HTTP Request GET /api/status| EmbeddedTomcat
    EmbeddedTomcat --> RestController
    RestController -->|HTTP Response 200 OK + JSON| Client

Principais Benefícios do Spring Boot:

  • Auto-configuração (@SpringBootApplication): Inicializa automaticamente o banco de dados, manipuladores de JSON (Jackson) e rotas HTTP com base nas dependências do pom.xml.
  • Servidor Embutido: Gera um único arquivo executável .jar que inclui o Apache Tomcat na porta 8080.
  • Injeção de Dependência (@Autowired): O Spring gerencia o ciclo de vida dos objetos (Beans) e os injeta onde forem necessários.

💻 2. Anatomia do Primeiro Endpoint REST (StatusController.java)

package com.portal.backend.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
 
// Indicates that this class is a REST Controller returning JSON automatically
@RestController
@RequestMapping("/api/status")
public class StatusController {
 
    // Handles HTTP GET requests to /api/status
    @GetMapping
    public Map<String, Object> obterStatusSistema() {
        Map<String, Object> resposta = new HashMap<>();
        resposta.put("aplicacao", "Portal Acadêmico Backend API");
        resposta.put("status", "OPERACIONAL");
        resposta.put("versaoJava", System.getProperty("java.version"));
        resposta.put("timestamp", LocalDateTime.now().toString());
        
        return resposta; // Jackson serializes the Map directly to JSON payload!
    }
}

💻 3. Classe Principal de Inicialização (BackendApplication.java)

package com.portal.backend;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class BackendApplication {
 
    public static void main(String[] args) {
        // Runs the embedded Tomcat server on port 8080
        SpringApplication.run(BackendApplication.class, args);
        System.out.println(">> REST API Spring Boot 3+ iniciada com sucesso na porta 8080!");
    }
}

⚔️ 4. Desafios Práticos (Exercícios 30/50/20)

🥉 Nível Bronze (Fixação)

  1. Para que serve a anotação @RestController em uma classe Spring Boot?
  2. O que significa o conceito de Injeção de Dependências (DI) gerenciado pelo Spring IoC Container?

🥈 Nível Prata (Aplicação)

  1. Crie uma nova classe de controlador AlunoController no pacote com.portal.backend.controller contendo a anotação @GetMapping("/api/alunos/resumo") que retorne a quantidade de alunos cadastrados e a média geral da instituição em formato JSON.

🥇 Nível Ouro (Desafio)

  1. Configure o arquivo de propriedades src/main/resources/application.properties para alterar a porta padrão do servidor de 8080 para 8090 (server.port=8090) e adicione um prefixo global de contexto /backend às rotas. Teste o acionamento no navegador.

💡 Gabaritos Sanfonados de Resposta

💡 Ver Gabarito do Nível Bronze
  1. A anotação @RestController avisa ao Spring que a classe manipulará requisições HTTP REST e que os retornos dos métodos devem ser automaticamente serializados em formato JSON (via biblioteca Jackson) no corpo da resposta.
  2. Injeção de Dependências é a técnica onde o framework cria e fornece as instâncias dos objetos de serviço/repositório de forma automática, tirando a responsabilidade do desenvolvedor de usar a instrução new.
💡 Ver Gabarito do Nível Prata & Ouro (Código Java Spring)
package com.portal.backend.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.Map;
 
@RestController
@RequestMapping("/api/alunos")
public class AlunoController {
 
    @GetMapping("/resumo")
    public Map<String, Object> obterResumoAcademico() {
        return Map.of(
            "totalAlunos", 1250,
            "mediaGeralInstituicao", 8.4,
            "statusMatriculas", "ABERTAS"
        );
    }
}

📚 Referências Teóricas Oficiais

  • SPRING FRAMEWORK DOCUMENTATION. Spring Boot Reference Documentation (v3.x) (VMware Tanzu / Pivotal).
  • WALLS, Craig. Spring in Action. 6th Edition. Manning Publications, 2022.

⬅️ Voltar ao Sumário da Fase 09 | Próximo Capítulo (Injeção de Dependências e Beans) ➡️