Contoh
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();
}
Adakah yang bisa menjelaskan hal ini kepada saya?
- Bagaimana pegas tahu tipe polimorfik mana yang digunakan.
- Apakah saya perlu
@Qualifier
atau tidak@Resource
? - Mengapa kita autowire antarmuka dan bukan kelas yang diimplementasikan?
java
spring
dependency-injection
stackoverflow
sumber
sumber
Jawaban:
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).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 menggunakanname
atribut anotasi ini.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.
Konfigurasi kacang Anda akan terlihat seperti ini:
Atau, jika Anda mengaktifkan pemindaian komponen pada paket yang ada, maka Anda harus memenuhi syarat setiap kelas dengan
@Component
sebagai berikut:Kemudian
worker
diMyRunner
akan disuntik dengan sebuah instance dari tipeB
.sumber
@Autowired @Qualifier("a1") a;
valid?@Autowired @Qualifier("a1") A a;
Juga dapat menyebabkan beberapa warnig dalam log seperti Cglib2AopProxy Tidak dapat menggunakan metode proxy . Dan banyak alasan lain untuk ini dijelaskan di sini. Mengapa selalu memiliki antarmuka implementaion tunggal dalam layanan dan lapisan dao?
sumber