Framework Spring
Inversão de Controle (IoC)
A Inversão de Controle (IoC) no Spring é um princípio onde o framework assume o controle do ciclo de vida e da ligação (wiring) dos objetos, em vez de a classe criá-los diretamente. O Spring gerencia esses objetos como “beans” em um contêiner, injetando as dependências automaticamente, o que desacopla o código e delega o controle de fluxo ao próprio framework.
Beans
Um bean é qualquer objeto Java cujo ciclo de vida (criação, configuração e destruição) é gerenciado pelo contêiner do Spring (IoC Container).
Injeção de Dependência (DI)
A Injeção de Dependência é o mecanismo prático para realizar a IoC. Se a classe A precisa da classe B, o Spring “injeta” a classe B dentro da classe A automaticamente.
No Spring, o IoC é o o quê (o objetivo final de desacoplamento), e a DI é o como (a técnica que o Spring usa para alcançar essa inversão). Por isso muitos usam os termos como sinônimos, mas tecnicamente a DI é uma forma de realizar o IoC.
Arquitetura básica
| Camada / Módulo | O que faz? | Anotação Comum |
| Spring MVC / Web | Cuida da comunicação HTTP, endpoints, rotas e APIs REST. | @RestController |
| Spring Service (Negócio) | Onde fica a lógica do seu sistema, validações e regras de negócio. | @Service |
| Spring Data (Persistência) | Facilita a comunicação com o banco de dados (SQL/NoSQL) sem você escrever queries brutas. | @Repository |
| Spring Boot | Não é um framework diferente, mas uma “capa” que auto-configura tudo isso para você não perder tempo com arquivos XML ou configurações complexas. | @SpringBootApplication |
Spring Cloud
Arquitetura de microsserviços
Service Discovery (Eureka): funciona como uma lista telefônica.
API Gateway (Spring Cloud Gateway, Zuul): funciona como o “porteiro” ou recepção do seu sistema.
Circuit Breaker (Resilience4j): se o serviço começar a falhar muito, em vez de travar a aplicação esperando um retorno que não vai acontecer, o Spring Cloud corta a comunicação imediatamente e executa uma lógica de contingência (um fallback).
Configuração Centralizada: Config Server centraliza as configurações de todos os microsserviços (geralmente em um repositório Git privado). Quando um microsserviço inicia, ele busca suas configurações e propriedades direto desse servidor central.
Persistência
JPA (Java Persistence API): É uma especificação (um conjunto de interfaces) do Java padrão (Jakarta EE) que define como mapear objetos Java para tabelas de um banco de dados relacional (ORM). Ela não faz nada sozinha, apenas dita as regras.
Hibernate: É uma implementação concreta da especificação JPA. Ele é o “motor” que realmente lê as anotações (como @Entity, @Id) e traduz as operações de objetos (como save, find) para comandos SQL no banco de dados.
Outras ferramentas
Hibernate Envers
O que faz: Auditoria de dados. Ele cria automaticamente tabelas de histórico (ex: cliente_AUD) para rastrear quem alterou o quê, quando e qual era o valor antigo.
Como usa: Basta anotar a entidade com @Audited. Toda inserção, atualização ou exclusão gera um registro na tabela de auditoria.
Objetivo: Atender requisitos legais ou de negócio que exigem trilha de alterações (ex: sistemas financeiros, ERPs).
Flyway
O que faz: Versionamento de esquema (migrations). Ele aplica scripts SQL (V1__cria_tabela.sql, V2__adiciona_coluna.sql) de forma controlada, garantindo que o banco de dados esteja sempre na versão esperada pelo código.
Como usa: Scripts SQL versionados na pasta db/migration. O Flyway mantém uma tabela de controle (flyway_schema_history) para saber quais já foram executados.
Objetivo: Manter consistência entre bancos de desenvolvimento, teste e produção, aplicando mudanças estruturais de forma confiável.