14‐Inversion of Control - JulianeMaran32/Java-with-Spring-Boot GitHub Wiki
Inversão de Controle (ou Inversion of Control, em inglês) é um conceito onde a criação e o gerenciamento dos objetos não são feitos diretamente por você, mas sim por um sistema externo — no caso do Spring, esse sistema é chamado de Container Spring.
Ou seja:
➡️ Você deixa de criar os objetos manualmente e
➡️ Delega essa tarefa ao Spring.
Imagine a seguinte situação:
Sua aplicação precisa de um treinador para fornecer um treino diário:
flowchart LR
A[My App] -- getDailyWorkout() --> B[CricketCoach]
B -- resposta --> A
style A fill:#f9caca,stroke:#c96c6c,stroke-width:2px,rx:10,ry:10
style B fill:#e4d4f5,stroke:#7e5dbb,stroke-width:2px,rx:10,ry:10
Com isso, você faz chamadas diretamente para o objeto CricketCoach
.
Agora, digamos que você queira mudar o treinador para outro esporte, como beisebol, hóquei, tênis ou ginástica.
🧠 Problema: A aplicação não é flexível. Toda vez que quiser trocar o tipo de treinador, terá que mudar o código.
A melhor solução seria algo assim:
flowchart TB
A[My App] -- "give me a 'Coach' object" --> B[Object Factory]
B --> A
B --> C[Configuração]
C -.-> D[CricketCoach]
C -.-> E[HockeyCoach]
C -.-> F[BaseballCoach]
style A fill:#f9caca,stroke:#c96c6c,stroke-width:2px,rx:10,ry:10
style B fill:#d3f0d6,stroke:#5c996f,stroke-width:2px,rx:10,ry:10
style C fill:#ffffff,stroke:#000000,stroke-width:1px
style D fill:#e4d4f5,stroke:#7e5dbb,stroke-width:2px,rx:10,ry:10
style E fill:#f7ebc6,stroke:#caa900,stroke-width:2px,rx:10,ry:10
style F fill:#dde9fc,stroke:#5f8edc,stroke-width:2px,rx:10,ry:10
- A Fábrica de Objetos é responsável por criar o treinador correto com base em uma configuração.
- Sua aplicação apenas solicita um treinador e usa a resposta.
- Assim, você consegue trocar de treinador sem alterar o código da aplicação.
🧠 Esse é o papel do Spring Container.
O Container Spring atua como essa Fábrica de Objetos inteligente.
flowchart TB
subgraph Spring
B[Object Factory]
end
A[My App] -- "give me a 'Coach' object" --> B
B --> A
B --> C[Configuração]
C -.-> D[CricketCoach]
C -.-> E[HockeyCoach]
C -.-> F[BaseballCoach]
style A fill:#f9caca,stroke:#c96c6c,stroke-width:2px,rx:10,ry:10
style B fill:#d3f0d6,stroke:#5c996f,stroke-width:2px,rx:10,ry:10
style C fill:#ffffff,stroke:#000000,stroke-width:1px
style D fill:#e4d4f5,stroke:#7e5dbb,stroke-width:2px,rx:10,ry:10
style E fill:#f7ebc6,stroke:#caa900,stroke-width:2px,rx:10,ry:10
style F fill:#dde9fc,stroke:#5f8edc,stroke-width:2px,rx:10,ry:10
O que o Spring faz por você:
- Cria os objetos conforme sua configuração
- Garante que as dependências (outros objetos necessários) sejam fornecidas automaticamente
-
Criação e gerenciamento de objetos
→ É aqui que entra a Inversão de Controle (IoC). -
Injeção de dependências
→ O Spring fornece automaticamente os objetos que uma classe precisa para funcionar. Esse processo é chamado de Injeção de Dependência (DI - Dependency Injection).
O Spring oferece três maneiras principais de fazer essa configuração:
-
XML
- Método antigo (legado)
⚠️ Não será abordado neste curso
-
Anotações Java
- Forma moderna e mais comum
- Usa anotações como
@Component
,@Autowired
, etc.
-
Código fonte Java (Java Configuration)
- Também moderna
- Usa classes Java com
@Configuration
e@Bean
👉 Neste curso, focaremos apenas nas duas abordagens modernas: anotações Java e configuração via código Java.