Pular para conteúdo

Aula 03 - Injeção de Dependências e IoC 💉

Nesta aula, vamos entender o conceito mais fundamental do Spring: como ele gerencia os objetos da sua aplicação para você, através da Inversão de Controle.

😊 Inversão de Controle (IoC)

Tradicionalmente, seu código cria seus próprios objetos com new. Com Inversão de Controle (IoC), é o framework que cria e entrega os objetos prontos para você — você só declara que precisa deles.

O Container Spring

O Spring gerencia um "container" de objetos chamados Beans. Um Bean é qualquer objeto cuja criação e ciclo de vida são controlados pelo Spring.

📊 Fluxo de Injeção de Dependências

graph LR
    Container[Container Spring - IoC] -- Injeta --> Controller[Controller]
    Container -- Injeta --> Service[Service]
    Controller -- Depende de --> Service

🧠 A Anotação @Autowired

Important

@Autowired diz ao Spring: "injete aqui uma instância pronta deste tipo, eu não vou criá-la com new".

@Service
public class ProdutoService {
    public String listar() {
        return "Lista de produtos";
    }
}

@RestController
public class ProdutoController {

    @Autowired
    private ProdutoService produtoService; // Injetado pelo Spring

    // O Spring já entrega o ProdutoService pronto para uso aqui
}

🧠 Por que Isso Importa?

Tip

Injeção de dependências facilita muito os testes (Aula 11): em vez de depender de uma implementação real, você pode "injetar" uma versão falsa (mock) do Service durante os testes.

📝 Exercícios Progressivos

  1. Básico: O que significa a sigla IoC?
  2. Básico: O que é um "Bean" no contexto do Spring?
  3. Intermediário: Qual a diferença entre criar um objeto com new e deixar o Spring injetá-lo?
  4. Intermediário: Por que a Injeção de Dependências facilita a escrita de testes automatizados?
  5. Desafio: Pesquise a diferença entre injeção via @Autowired em atributo e injeção via construtor — qual é considerada a melhor prática hoje?

🚀 Mini-projeto: Crie uma classe SaudacaoService com um método saudar(). Injete-a em um Controller usando @Autowired e chame o método a partir dele.