Suponha que eu tenha interfaces como estas:
interface Country {}
class USA implements Country {}
class UK implements Country ()
E este snippet de configuração xml:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
Como posso controlar qual dependência é autowired abaixo? Eu gostaria do Reino Unido.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Estou usando o Spring 3.0.3.RELEASE.
Respostas:
Isso está documentado na seção 3.9.3 do manual Spring 3.0:
Em outras palavras, o comportamento padrão é como se você tivesse adicionado
@Qualifier("country")
ao método setter.fonte
country
)Você pode usar a anotação @Qualifier
A partir daqui
Ajuste automático baseado em anotações com qualificadores
Como o autowiring por tipo pode levar a vários candidatos, muitas vezes é necessário ter mais controle sobre o processo de seleção. Uma maneira de fazer isso é com a anotação @Qualifier do Spring. Isso permite associar valores de qualificador a argumentos específicos, estreitando o conjunto de correspondências de tipo para que um bean específico seja escolhido para cada argumento. No caso mais simples, pode ser um valor descritivo simples:
Isso usará o Reino Unido, adicionará uma id ao bean dos EUA e usará se você quiser os EUA.
fonte
Outra maneira de obter o mesmo resultado é usar a anotação @Value:
Nesse caso, a
"#{country}
string é uma expressão Spring Expression Language (SpEL) que avalia como um bean denominadocountry
.fonte
Mais uma solução para resolver por nome:
Ele usa o pacote javax.annotation , então não é específico do Spring, mas o Spring o suporta.
fonte
@Resource
não estará lá pronto para uso com o java 11 devido aos módulos do quebra-cabeçasem alguns casos, você pode usar a anotação @Primary.
Dessa forma, ele será selecionado como o candidato autowire padrão, sem a necessidade de autowire-candidato no outro bean.
para obter mais informações, consulte Autowiring dois beans implementando a mesma interface - como definir o bean padrão para autowire?
fonte