Exemplo
interface IA
{
public void someFunction();
}
@Resource(name="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Resource(name="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
worker.someFunction();
}
Alguém pode me explicar isso.
- Como a primavera sabe qual tipo polimórfico usar.
- Eu preciso
@Qualifier
ou@Resource
? - Por que conectamos automaticamente a interface e não a classe implementada?
java
spring
dependency-injection
stackoverflow
fonte
fonte
Respostas:
Desde que haja apenas uma única implementação da interface e essa implementação seja anotada com
@Component
a verificação de componente do Spring ativada, a estrutura do Spring pode descobrir o par (interface, implementação). Se a varredura de componentes não estiver ativada, você deverá definir explicitamente o bean no seu application-config.xml (ou arquivo de configuração equivalente da primavera).Depois de ter mais de uma implementação, você precisará qualificar cada uma delas e, durante a fiação automática, você precisará usar a
@Qualifier
anotação para injetar a implementação correta, juntamente com a@Autowired
anotação. Se você estiver usando @Resource (semântica J2EE), deverá especificar o nome do bean usando oname
atributo desta anotação.Em primeiro lugar, é sempre uma boa prática codificar para interfaces em geral. Em segundo lugar, no caso da primavera, você pode injetar qualquer implementação em tempo de execução. Um caso de uso típico é injetar implementação simulada durante o estágio de teste.
Sua configuração de bean deve ficar assim:
Como alternativa, se você ativou a varredura de componentes no pacote em que estes estão presentes, você deve qualificar cada classe da
@Component
seguinte maneira:Em seguida,
worker
emMyRunner
vai ser injectado com uma instância do tipoB
.fonte
@Autowired @Qualifier("a1") a;
válido?@Autowired @Qualifier("a1") A a;
Também pode causar alguns avisos em logs como um método Cglib2AopProxy Unable to proxy . E muitas outras razões para isso são descritas aqui. Por que sempre há interfaces de implementação únicas nas camadas de serviço e dao?
fonte