Bagaimana pegas tahu tipe polimorfik mana yang digunakan.
Selama hanya ada satu implementasi antarmuka dan implementasi itu dijelaskan dengan @Componentpemindaian komponen Spring diaktifkan, kerangka kerja Spring dapat mengetahui pasangan (antarmuka, implementasi). Jika pemindaian komponen tidak diaktifkan, maka Anda harus mendefinisikan kacang secara eksplisit di aplikasi-config.xml Anda (atau file konfigurasi pegas yang setara).
Apakah saya memerlukan @Qualifier atau @Resource?
Setelah Anda memiliki lebih dari satu implementasi, maka Anda harus memenuhi syarat masing-masing dan selama pengkabelan otomatis, Anda perlu menggunakan @Qualifieranotasi untuk menyuntikkan implementasi yang tepat, bersama dengan @Autowiredanotasi. Jika Anda menggunakan @Resource (semantik J2EE), maka Anda harus menentukan nama bean menggunakan nameatribut anotasi ini.
Mengapa kita autowire antarmuka dan bukan kelas yang diimplementasikan?
Pertama, selalu merupakan praktik yang baik untuk kode ke antarmuka secara umum. Kedua, dalam hal pegas, Anda dapat menyuntikkan implementasi apa pun saat runtime. Kasus penggunaan yang umum adalah untuk menyuntikkan implementasi tiruan selama tahap pengujian.
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();
}
Konfigurasi kacang Anda akan terlihat seperti ini:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
Atau, jika Anda mengaktifkan pemindaian komponen pada paket yang ada, maka Anda harus memenuhi syarat setiap kelas dengan @Componentsebagai berikut:
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();
}
Kemudian workerdi MyRunnerakan disuntik dengan sebuah instance dari tipe B.