Sobes.tech
Junior — Middle

Como o Spring determina qual implementação de uma interface escolher ao usar @Autowired, quando existem várias opções?

sobes.tech IA

Resposta da IA

Quando no Spring há várias implementações de uma mesma interface e é utilizada a anotação @Autowired, o framework tenta determinar qual implementação injetar, seguindo estas regras:

  1. Por nome do bean: O Spring procura um bean cujo nome corresponda ao nome do campo ou parâmetro onde a injeção ocorre.
  2. Anotação @Qualifier: Se houver vários candidatos, pode-se especificar explicitamente o bean desejado usando @Qualifier("nomeDoBean").
  3. Anotação @Primary: Se um dos beans estiver marcado como @Primary, ele será selecionado por padrão.
  4. Exceção em caso de ambiguidade: Se nenhuma das condições ajudar a determinar qual bean usar, o Spring lançará uma exceção NoUniqueBeanDefinitionException.

Exemplo:

@Component
@Primary
public class ServiceImpl1 implements MyService {}

@Component
public class ServiceImpl2 implements MyService {}

@Autowired
private MyService myService; // será injetado o ServiceImpl1 devido ao @Primary

@Autowired
@Qualifier("serviceImpl2")
private MyService myService2; // especifica explicitamente o ServiceImpl2