Bagaimana pegas tahu tipe polimorfik mana yang digunakan.
Selama hanya ada satu implementasi antarmuka dan implementasi itu dijelaskan dengan @Component
pemindaian 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 @Qualifier
anotasi untuk menyuntikkan implementasi yang tepat, bersama dengan @Autowired
anotasi. Jika Anda menggunakan @Resource (semantik J2EE), maka Anda harus menentukan nama bean menggunakan name
atribut 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 @Component
sebagai 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 worker
di MyRunner
akan disuntik dengan sebuah instance dari tipe B
.