Beispiel
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();
}
Kann mir das jemand erklären.
- Woher weiß Spring, welcher polymorphe Typ verwendet werden soll?
- Benötige ich
@Qualifier
oder@Resource
? - Warum verdrahten wir die Schnittstelle automatisch und nicht die implementierte Klasse?
java
spring
dependency-injection
Paketüberfluss
quelle
quelle
Antworten:
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.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 desname
Attributs dieser Anmerkung angeben .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.
Ihre Bean-Konfiguration sollte folgendermaßen aussehen:
Wenn Sie alternativ den Komponentenscan für das Paket aktiviert haben, in dem diese vorhanden sind, sollten Sie jede Klasse
@Component
wie folgt qualifizieren:Dann
worker
inMyRunner
mit einer Instanz des Typs injiziert werdenB
.quelle
@Autowired @Qualifier("a1") a;
gültig?@Autowired @Qualifier("a1") A a;
Es kann auch einige Warnungen in Protokollen wie a verursachen Warnungen Cglib2AopProxy-Proxy-Methode . Und viele andere Gründe dafür werden hier beschrieben. Warum immer einzelne Implementierungsschnittstellen in Service- und Dao-Schichten?
quelle