14‐Inversion of Control - JulianeMaran32/Java-with-Spring-Boot GitHub Wiki

Inversion of Control (IoC)

31. O que é Inversão de Controle?

Inversão de Controle (IoC)

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.

Cenário de Código

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
Loading

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.

Solução Ideal

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
Loading
  • 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

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
Loading

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

Funções principais do Spring Container

  1. Criação e gerenciamento de objetos
    → É aqui que entra a Inversão de Controle (IoC).

  2. 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).

Como configurar o Spring Container?

O Spring oferece três maneiras principais de fazer essa configuração:

  1. XML

    • Método antigo (legado)
    • ⚠️ Não será abordado neste curso
  2. Anotações Java

    • Forma moderna e mais comum
    • Usa anotações como @Component, @Autowired, etc.
  3. 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.

⚠️ **GitHub.com Fallback** ⚠️