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

[Dúvida] Criar Repository em outras classes que não sejam @SpringBootApplication

Olá, pessoal

No curso, foi falado sobre a criação do repositório na classe com anotação @SpringBootApplication (exemplo "ScreenmatchApplication") para não gerar complexidade na didática da aula 10-Salvando dados do banco, unidade 02.

Nesta mesma aula foi mencionado sobre a disponibilização de documentos sobre anotações @Bean, @Component, @Configuration para criarmos classes gerenciaveis pelo Spring, de modo a não precisarmos criar o repositório no "Main" e repassa´-los até às classes onde efetivamente o consumiremos. Pensei que tal material adicional de referência viria no capítulo seguinte (Para saber mais: Tipos de injeção de dependência).

Supondo o seguinte exemplo:

  • ScreenmatchApplication instancia um objeto Principal
  • Principal instancia um objeto MenuDeSeries
  • MenuDeSeries gerencia CRUD da classe Serie (aqui o repositório SerieRepository seria efetivamente consumido) Como poderia ser implementada a Injeção de Dependência para que o Repository fosse criado em "MenuDeSeries"?

Desde já, agradeço.

1 resposta
solução!

Olá!

O ideal é fazer com que a classe MenuDeSeries seja gerenciada pelo Spring, ou seja, anotá-la com @Component. Assim, o Spring pode injetar automaticamente o SerieRepository.

Como fazer:

Anote MenuDeSeries com @Component:

@Component
public class MenuDeSeries {
    
    private final SerieRepository repository;

    public MenuDeSeries(SerieRepository repository) {
        this.repository = repository;
    }

    // métodos que usam o repository...
}

Garanta que SerieRepository está anotado com @Repository: Se ele estende JpaRepository, o Spring já reconhece.

Na classe principal (ScreenmatchApplication) use a anotação @SpringBootApplication normalmente. Para rodar algo usando MenuDeSeries, injete ela:

@SpringBootApplication
public class ScreenmatchApplication implements CommandLineRunner {

    private final MenuDeSeries menu;

    public ScreenmatchApplication(MenuDeSeries menu) {
        this.menu = menu;
    }

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

    @Override
    public void run(String... args) throws Exception {
        menu.exibeMenu(); // ou outro método
    }
}

assim:

  • Usa @Component para que o Spring gerencie a classe.
  • Faz a injeção via construtor.
  • O Spring cuida de passar o Repository internamente, sem precisar criá-lo manualmente no main.

Isso deixa seu código mais limpo e com baixa acoplamento.