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:
- Por nome do bean: O Spring procura um bean cujo nome corresponda ao nome do campo ou parâmetro onde a injeção ocorre.
- Anotação
@Qualifier: Se houver vários candidatos, pode-se especificar explicitamente o bean desejado usando@Qualifier("nomeDoBean"). - Anotação
@Primary: Se um dos beans estiver marcado como@Primary, ele será selecionado por padrão. - 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