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:

  1. Injetar dependência de repositório em classe @Service utilizando 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)

  1. Salve o arquivo como: Atividade_02_1_SeuNome
  2. 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:

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

  1. Salve o arquivo como: Atividade_02_2_SeuNome
  2. 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:

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

  1. Salve o arquivo como: Atividade_02_3_SeuNome
  2. 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:

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

  1. Salve o arquivo como: Atividade_02_4_SeuNome
  2. 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...");
    }
}