Pendahuluan Injeksi Ketergantungan
Pertama -tama mari kita tinjau konsep injeksi ketergantungan:
Injeksi ketergantungan dan inversi kontrol, yang sering kita sebutkan adalah konsep yang sama. Arti spesifiknya adalah: ketika peran (mungkin contoh Java, penelepon) membutuhkan bantuan dari peran lain (instance Java lain, penelepon), dalam proses pemrograman tradisional, penelepon biasanya dibuat oleh penelepon. Tetapi di musim semi, pekerjaan menciptakan callee tidak lagi dilakukan oleh penelepon, jadi itu disebut inversi kontrol; Pekerjaan membuat instance callee biasanya dilakukan oleh wadah pegas dan kemudian disuntikkan ke penelepon, sehingga juga disebut injeksi ketergantungan.
Faktanya, sederhananya, peran injeksi ketergantungan adalah untuk memisahkan ketergantungan antara objek dari kode asli, dan untuk menambahkan pemrosesan kerangka kerja musim semi untuk memungkinkan kita untuk mengelola dependensi secara fleksibel dan terpusat.
Kerangka Injeksi Ketergantungan
Kerangka kerja injeksi ketergantungan tidak misterius, itu sebenarnya hal yang sangat sederhana. Jangan lihat kode sumber injeksi ketergantungan musim semi, karena selama Anda pergi, itu berarti Anda tidak akan pernah menulis lagi dan Anda tidak akan berani memulai sendiri. Fungsinya terlalu kuat, jadi desainnya terlalu rumit. Programmer biasa hanya bisa menghela nafas saat melihatnya.
Saya tidak membaca kode sumber musim semi dengan cermat. Meski begitu, hanya butuh setengah hari untuk menerapkan kerangka kerja kecil iockids yang pada dasarnya memenuhi standar injeksi ketergantungan standar "JSR-330". Kerangka kerja kecil ini hanya memiliki satu injektor kelas utama, dengan sekitar 200 baris kode, dan memiliki fungsi berikut.
Mari kita lihat contoh penggunaan yang sedikit lebih rumit
import javax.inject.inject; import javax.inject.named; import javax.inject.singleton; import iockids.injector; @singletonclass root {@inject @named ("a") node a; @Inject @named ("b") node b; @Override public string toString () {return string.format ("root ( %s, %s)", a.name (), b.name ()); }} antarmuka node {string name ();}@singleton@named ("a") class nodea mengimplementasikan node {@Inject Leaf Leaf; @Inject @named ("b") node b; @Override public string name () {if (b == null) return string.format ("nodea (%s)", daun); lain return string.format ("nodeawithb (%s)", daun); }}@Singleton@bernama ("b") NodeB kelas mengimplementasikan node {daun daun; @Inject @named ("a") node a; @Inject nodeb publik (daun daun) {this.leaf = daun; } @Override name string publik () {if (a == null) return string.format ("nodeB (%s)", daun); lain return string.format ("nodebwitha (%s)", daun); }} class Leaf {@Inject root root; indeks int; Urutan int statis; public leaf () {index = Sequence ++; } public string toString () {if (root == null) return "leaf" + index; lain mengembalikan "LeafWithroot" + indeks; }} Demo kelas publik {public static void main (string [] args) {var injector = new injector (); injektor.RegisterQualifiedClass (node.class, nodea.class); injektor.RegisterQualifiedClass (node.class, nodeb.class); var root = injector.getInstance (root.class); System.out.println (root); }}Kode di atas menggunakan semua fungsi yang disediakan oleh iockids.
Untuk memfasilitasi pemahaman tentang kode di atas, saya menggambar diagram ketergantungan
Output kode di atas adalah sebagai berikut
root (nodeawithb (leafwithroot0), nodebwitha (leafwithroot1))
Dari output ini, kita juga dapat membayangkan secara kasar struktur ketergantungan.
IOCKIDS memberikan laporan pengecualian kesalahan injeksi yang kaya untuk mencegah kesalahan konfigurasi injeksi pengguna.
Misalnya, jika kami mengonfigurasi nama NODEA dan NODEB di atas ke A yang sama, tumpukan kesalahan di bawah ini akan diekspos.
iockids.InjectException: duplikat javax.inject.inject.namah dengan kelas yang sama iockids.demo.node di iockids.injector.RegisterquiLiedClass (injector.java:87) di iockids.injector.RegisterQualifiedClass (injector.java:70) iockids.demo.demo.main (demo.java:106)
Jika kami menambahkan parameter ke konstruktor NodeB sesuka
@Inject nodeb publik (daun daun, int k) {this.leaf = daun; }Kesalahan berikut akan dilemparkan saat berjalan
iockids.InjectException: Tidak ada konstruktor yang dapat diakses untuk kelas injeksi int di iockids.injector.createenew (injector.java:120) di iockids.injector.createenew (injector.java:94) di iockids.injector.createFromparameter (injector.java:167 iockids.injector.createFromConstructor (injector.java:145) di iockids.injector.createNew (injector.java:123) di iockids.injector.createFromquialified (injector.java:216) di iockid.createDector.crectore.cureFfield. iockids.Injector.InjectMembers (injector.java:233) di iockids.injector.createenew (injector.java:136) di iockids.injector.createFromqualified (injector.java:216) di iockids.injector.cheatromromrom.java:216) di iockids.injector.cheatefromrom.java:or.aVa. iockids.Injector.injectMembers(Injector.java:233) at iockids.Injector.createNew(Injector.java:136) at iockids.Injector.createNew(Injector.java:94) at iockids.Injector.getInstance(Injector.java:245) at iockids.demo.demo.main (demo.java:107)
Project Open Source Address: https://github.com/pyloque/iockids (unduhan lokal)
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.