Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] @Autowired se aplicaria aqui?

Dentro da classe main eu fiz assim:

@SpringBootApplication
public class ScreenmatchApplication implements CommandLineRunner {
    @Autowired
    private ConsumoAPI consumoAPI;

    public static void main(String[] args) {
        SpringApplication.run(ScreenmatchApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println(consumoAPI.obterDados("https://www.omdbapi.com/?t=gilmore+girls&apikey=6585022c"));
    }

}

Viram só? Coloquei o @autowired para fazer injeção da service.

Agora na classe ConsumoAPI, eu coloquei a notação @Service no topo:

@Service
public class ConsumoAPI {
    public String obterDados(String endereco) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();
        HttpResponse<String> response = null;
        try {
            response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        String json = response.body();
        return json;
    }
}

Existe algum problema em seguir dessa forma? qual a diferença de fazer sem o @autowired e @Service?

1 resposta
solução!

Oii, Gabriel! Tudo bem?

Agradeço por compartilhar.

Você mandou muito bem ao identificar que a classe ConsumoApi tem o perfil de um serviço e que, em um projeto Spring, o comum é deixarmos o framework gerenciar essas instâncias. O código que você escreveu utilizando @Autowired e @Service está tecnicamente correto e funciona perfeitamente, né?

A principal diferença entre fazer do jeito manual (com new) e usar a injeção de dependências do Spring é o controle do ciclo de vida. Quando você usa o new, você é quem "manda" no objeto. Quando usa @Service, você delega essa responsabilidade para o Spring, o que traz algumas vantagens:

  1. Injeção de dependências: Se sua classe ConsumoApi precisasse de outra classe (como um repositório ou outro serviço), o Spring resolveria isso automaticamente pra você.
  2. Singleton por padrão: O Spring cria apenas uma instância dessa classe para toda a aplicação, economizando memória, tá?
  3. Facilidade em Testes: Fica muito mais simples trocar a implementação real por um "mock" (um objeto de teste) na hora de validar seu código.

Para ir além, vale notar por que na aula foi usado o new. Como o projeto está apenas começando e a classe ConsumoApi não possui estado (não guarda dados que mudam) nem outras dependências, as instrutoras optaram pelo caminho mais simples e didático. Em aplicações menores ou utilitárias, o new não é um erro grave, mas conforme o projeto cresce, a abordagem que você trouxe com @Service e @Autowired é considerada a boa prática de mercado, pois mantém o código mais desacoplado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!