🧩 Exercícios: Injeção de Dependências e Scopes
Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 02.1 — Injeção por Construtor (Constructor Injection)
Contexto: Injeção por Construtor (Constructor Injection) no contexto de Injeção de Dependências e Scopes.
Requisitos de Execução:
- Injetar dependência de repositório em classe
@Serviceutilizando injeção obrigatória por construtor.
Resultado Esperado
Serviço instanciado com repositório injetado de forma segura e imutável.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_1_SeuNome - Envie na tarefa:
Atividade Cap 02 - Injeção de Dependências e Scopes
🔑 Gabarito de Código & Solução Comentada
// UsuarioService.java
package com.empresa.api.service;
import org.springframework.stereotype.Service;
@Service
public class UsuarioService {
private final NotificadorService notificador;
public UsuarioService(NotificadorService notificador) {
this.notificador = notificador;
}
public void cadastrarUsuario(String email) {
notificador.enviar("Bem-vindo: " + email);
}
}
🔍 Nível 2: Prática
Problema 02.2 — Desambiguação de Beans com @Primary e @Qualifier
Contexto: Desambiguação de Beans com @Primary e @Qualifier no contexto de Injeção de Dependências e Scopes.
Requisitos de Execução:
- Criar duas implementações de
NotificadorService(Email e SMS) e usar@Qualifier('smsNotificador').
Resultado Esperado
Bean SMS selecionado explicitamente via anotação @Qualifier.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_2_SeuNome - Envie na tarefa:
Atividade Cap 02 - Injeção de Dependências e Scopes
🔑 Gabarito de Código & Solução Comentada
// NotificadorConfig.java
package com.empresa.api.service;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
interface NotificadorService { void enviar(String msg); }
@Component("emailNotificador")
class EmailNotificador implements NotificadorService {
public void enviar(String msg) { System.out.println("Email: " + msg); }
}
@Component("smsNotificador")
class SmsNotificador implements NotificadorService {
public void enviar(String msg) { System.out.println("SMS: " + msg); }
}
⚡ Nível 3: Integração
Problema 02.3 — Bean Scopes: Singleton vs Prototype
Contexto: Bean Scopes: Singleton vs Prototype no contexto de Injeção de Dependências e Scopes.
Requisitos de Execução:
- Configurar bean com
@Scope('prototype')e demonstrar a criação de novas instâncias a cada solicitação.
Resultado Esperado
Instância Singleton (mesmo hashCode) vs Instância Prototype (hashCodes distintos).
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_3_SeuNome - Envie na tarefa:
Atividade Cap 02 - Injeção de Dependências e Scopes
🔑 Gabarito de Código & Solução Comentada
// PrototypeBean.java
package com.empresa.api.config;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype")
public class GeradorProtocolo {
private final long timestamp = System.currentTimeMillis();
public long getTimestamp() { return timestamp; }
}
🏆 Nível 4: Desafio Corporativo
Problema 02.4 — Ciclo de Vida de Beans com @PostConstruct e @PreDestroy
Contexto: Ciclo de Vida de Beans com @PostConstruct e @PreDestroy no contexto de Injeção de Dependências e Scopes.
Requisitos de Execução:
- Implementar métodos de inicialização (carga de cache) e encerramento (fechamento de conexões).
Resultado Esperado
PostConstruct: Cache aquecido | PreDestroy: Recursos liberados.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_4_SeuNome - Envie na tarefa:
Atividade Cap 02 - Injeção de Dependências e Scopes
🔑 Gabarito de Código & Solução Comentada
// LifecycleBean.java
package com.empresa.api.config;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.stereotype.Component;
@Component
public class CacheWarmupService {
@PostConstruct
public void inicializar() {
System.out.println("LOG: Aquecendo cache corporativo na inicialização...");
}
@PreDestroy
public void encerrar() {
System.out.println("LOG: Esvaziando buffers antes do shutdown...");
}
}