Pendahuluan: Ketergantungan melingkar adalah referensi loop bersarang di kelas N. Jika ketergantungan melingkar ini terjadi dalam pengembangan harian menggunakan metode objek baru, program akan terus menyebutnya loop saat runtime sampai memori meluap dan melaporkan kesalahan. Mari kita bicara tentang Spring jika menyelesaikan dependensi melingkar.
Jenis Pertama: Ketergantungan Siklik Parameter Konstruktor
Wadah musim semi akan menempatkan setiap pengidentifikasi kacang yang dibuat di "kumpulan kacang saat ini" dan pengidentifikasi kacang akan tetap berada di kolam ini selama proses penciptaan. Karena itu, jika Anda menemukan bahwa Anda sudah berada di "kumpulan kacang saat ini" selama proses pembuatan, itu akan dilemparkan.
Pengecualian Excreation Exception menunjukkan ketergantungan melingkar; Kacang yang dibuat akan dibersihkan dari "Kolam Bersama yang sedang dibuat".
Pertama, kami menginisialisasi tiga kacang.
StudentB kelas publik {private studentB; public void setStudentB (StudentB StudentB) {this.studentb = studentB; } public studenta () {} public studenta (StudentB StudentB) {this.studentb = studentB; }} StudentB kelas publik {private studentc studentc; public void setStudentC (studentc studentc) {this.studentc = studentc; } public studentB () {} public studentB (studentc studentc) {this.studentc = studentc; }} Studentc kelas publik {private studenta studenta; public void setStudenta (Studasi Studenta) {this.studenta = studer; } public studentc () {} public studentc (studenta studenta) {this.studenta = studenta; }}Oke, di atas adalah tiga kelas yang sangat mendasar. Struktur parameter Studer adalah StudentB. Struktur parameter StudentB adalah StudentC, dan struktur parameter StudentC adalah Studenta, yang menciptakan situasi ketergantungan melingkar.
Kami semua menyerahkan ketiga kacang ini kepada manajemen musim semi dan menghidupkannya dengan konstruksi parameter
<bean id="a"> <constructor-arg index="0" ref="b"></constructor-arg> </bean> <bean id="b"> <constructor-arg index="0" ref="c"></constructor-arg> </bean> <bean id="c"> <constructor-arg index="0" ref="a"></constructor-arg> </bean>
Inilah kelas tesnya:
tes kelas publik {public static void main (string [] args) {applicationContext context = new ClassPathXMLapPlicationContext ("com/zfx/student/applicationContext.xml"); //System.out.println(context.getbean("a ", studer.class)); }}Pesan kesalahan hasil eksekusi adalah:
Disebabkan oleh: org.springframework.beans.factory.beanCureChencreationException:
Kesalahan membuat kacang dengan nama 'A': Bean yang diminta saat ini sedang dalam pembuatan: Apakah ada referensi melingkar yang tidak dapat diselesaikan?
Jika Anda memahami kalimat di awal, Anda tidak akan terkejut melaporkan kesalahan ini. The Spring Container pertama kali menciptakan Singleton Studenton. Studik tergantung pada StudentB, dan kemudian menempatkan di "kumpulan kacang saat ini". Pada saat ini, StudentB diciptakan, StudentB tergantung pada StudentC, dan kemudian B ditempatkan di "Kolam Ban Saat Ini". Pada saat ini, StudentC dibuat, StudentC bergantung pada Studer. Namun, saat ini, siswa sudah berada di kolam renang, jadi kesalahan akan dilaporkan. Karena semua kacang di kolam belum diinisialisasi, mereka akan bergantung pada kesalahan. (Kacang yang diinisialisasi akan dihapus dari kolam)
Tipe Kedua: Metode Setter Singleton, Metode Default
Jika Anda ingin berbicara tentang injeksi setter, sebaiknya melihat gambar kacang instantiating di musim semi
Seperti yang ditunjukkan dalam dua langkah pertama dalam gambar, Spring memancing objek kacang dan kemudian mengatur properti objek.
Ubah file konfigurasi untuk menyuntikkannya ke mode set:
<!-scope = "singleton" (default adalah metode singleton)-> <bean id = "a" scope = "singleton"> <properti name = "studentb" ref = "b"> </preate> </bean> <bean id = "b" scope = "singleton"> <Properti nama = "coid" c " scope = "singleton"> <properti name = "studer" ref = "a"> </prop Propert> </ bean>
Inilah kelas tesnya:
tes kelas publik {public static void main (string [] args) {applicationContext context = new ClassPathXMLapPlicationContext ("com/zfx/student/applicationContext.xml"); System.out.println (Context.getBean ("A", Student.class)); }}Hasil cetak adalah:
com.zfx.student.studenta@1fbfd6
Mengapa Anda tidak melaporkan kesalahan dengan menggunakan metode set?
Mari kita lihat gambar di atas. Spring First Instantiates The Bean Object menggunakan konstruk. Pada saat ini, Spring akan menempatkan objek yang instantiated ke dalam peta, dan Spring menyediakan metode untuk mendapatkan referensi objek yang dipakai dengan atribut yang tidak disetel. Berdasarkan contoh kami, ketika Spring Instantiates Studenta, StudentB, dan StudentC, kemudian akan mengatur properti objek. Pada saat ini, Studasi akan mengandalkan StudentB dan akan mengeluarkan objek Siswa Singleton di peta, dan sebagainya, tidak akan ada masalah loop.
Berikut ini adalah metode implementasi dalam kode sumber musim semi. Kode sumber berikut ada di kelas DefaultSingLeTonBeanRegistry.java di Paket Bean Spring
/ ** cache objek singleton: nama kacang -> instance bean (koleksi peta yang menyimpan objek instantiated singleton)*/ peta akhir privat <string, objek> singletonObjects = concurrenthashmap baru <string, objek> (64); / ** cache pabrik singleton: nama kacang -> objectFactory (singleton factory bean cache collection)*/ peta akhir privat <string, objectFactory> singletonfactory = hashmap baru <string, objectFactory> (16); / ** cache objek singleton awal: nama kacang -> instance bean*/ peta akhir privat <string, objek> EarsingletonObjects = hashmap baru <string, objek> (16); / ** Set singleton terdaftar, berisi nama -nama kacang dalam urutan pendaftaran*/ Private Final Set <string> terdaftar diLECTETONS = new LinkedHashset <Rips> (64); /*** Tambahkan instance singleton* Selesaikan masalah referensi melingkar* Tambahkan pabrik singleton yang diberikan untuk membangun singleton yang ditentukan* jika perlu. * <p> Untuk dipanggil untuk pendaftaran singleton yang bersemangat, misalnya untuk dapat * menyelesaikan referensi melingkar. * @param beanname Nama kacang * @param singletonfactory pabrik untuk objek singleton */ void yang dilindungi addsingletonfactory (string beanname, singletonfactory singleton) {assert.notnull (singletonFactory, "singleton factory tidak boleh disingkirkan"); disinkronkan (this.singletonObjects) {if (! this.singletonObjects.containskey (beanname)) {this.singletonfactories.put (beanname, singletonfactory); this.earlysingletonobjects.remove (beanname); this.registeredsingletons.add (beanname); }}Tipe ketiga: prototipe setter, prototipe
Ubah file konfigurasi ke:
<bean id="a" <span style="color:#FF0000;">scope="prototype"</span>> <property name="studentB" ref="b"></property> </bean> <bean id="b" <span style="color:#FF0000;">scope="prototype"</span>> <property name="studentC" ref="c"></property> </bean> <bean id = "c" <span style = "color:#ff0000;"> scope = "prototipe" </span>> <name properti = "studentc" ref = "c"> </preate> </ bean> <bean id = "c" <span style = "color = ff0000;"> scope = "prootype" </span/</span> "a ff0000;"> scope = "ProType" </span/span> "AMEKUP =" FF0000; "> SCOPE =" Prototype "</Span/Span>" AMEKUP = "AMEKUP =" AMEKUP = "SKOPE =" BEAN "</SPAN" </SPANED "<"
Scope = "Prototipe" berarti bahwa objek instan dibuat setiap kali Anda meminta. Perbedaan antara keduanya adalah: Kacang stateful menggunakan lingkup prototipe, sedangkan stateless umumnya menggunakan lingkup singleton singleton.
Kasus Uji:
tes kelas publik {public static void main (string [] args) {applicationContext context = new ClassPathXMLapPlicationContext ("com/zfx/student/applicationContext.xml"); <strong> // Saat ini, Anda harus mendapatkan instance dari pegas yang dikelola, karena sekarang scope = "prototipe" hanya akan membuat objek saat meminta untuk mendapatkan </strong> system.out.println (context.getBean ("a", student.class)); }} Hasil Cetak:
Disebabkan oleh: org.springframework.beans.factory.beanCureCreCreationException: kesalahan membuat kacang dengan nama 'a': Bean yang diminta saat ini sedang dalam pembuatan: apakah ada referensi melingkar yang tidak dapat diselesaikan?
Mengapa model prototipe salah?
Untuk kacang "prototipe", wadah pegas tidak dapat melengkapi injeksi ketergantungan karena wadah pegas tidak menemui kacang dalam kacang "prototipe", sehingga kacang yang dibuat tidak dapat diekspos terlebih dahulu.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.