Woher weiß Spring, welcher polymorphe Typ verwendet werden soll?
Solange es nur eine einzige Implementierung der Schnittstelle gibt und diese Implementierung mit @Component
aktiviertem Spring-Komponentenscan kommentiert ist , kann das Spring-Framework das Paar (Schnittstelle, Implementierung) ermitteln. Wenn der Komponentenscan nicht aktiviert ist, müssen Sie die Bean explizit in Ihrer application-config.xml (oder einer entsprechenden Spring-Konfigurationsdatei) definieren.
Benötige ich @Qualifier oder @Resource?
Sobald Sie mehr als eine Implementierung haben, müssen Sie jede davon qualifizieren. Während der automatischen Verkabelung müssen Sie die @Qualifier
Annotation verwenden, um die richtige Implementierung zusammen mit der @Autowired
Annotation einzufügen. Wenn Sie @Resource (J2EE-Semantik) verwenden, sollten Sie den Bean-Namen mithilfe des name
Attributs dieser Anmerkung angeben .
Warum verdrahten wir die Schnittstelle automatisch und nicht die implementierte Klasse?
Erstens ist es immer eine gute Praxis, auf Schnittstellen im Allgemeinen zu codieren. Zweitens können Sie im Falle eines Frühlings jede Implementierung zur Laufzeit einfügen. Ein typischer Anwendungsfall ist das Einfügen einer Scheinimplementierung während der Testphase.
interface IA
{
public void someFunction();
}
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
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();
}
Ihre Bean-Konfiguration sollte folgendermaßen aussehen:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
Wenn Sie alternativ den Komponentenscan für das Paket aktiviert haben, in dem diese vorhanden sind, sollten Sie jede Klasse @Component
wie folgt qualifizieren:
interface IA
{
public void someFunction();
}
@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Dann worker
in MyRunner
mit einer Instanz des Typs injiziert werden B
.