Saya mendekonstruksi bagaimana musim semi mengelola objek java dengan contoh sederhana.
Pertama, tentukan pojo sederhana, kodenya adalah sebagai berikut:
Paket com.jvk.ken.spring; Demo kelas publik {nama string privat; demo publik () {name = "I'm Demo.";} public void printName () {System.out.println (name);} public void setName (string name) {this.name = name;}}File konfigurasi pegas yang sesuai adalah sebagai berikut:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/context http://wwww.spramework.org.orgaMema/contex http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springfringework.org/schema/beans/spring-teans-3.1.xpramework.org/schema/beans/spring-teans-3.1.xpramework.org/schema/beans/spring-teans-3.1.xpramework.org/schema/beans/spring-teans-3.1.xsd
Kode tes sederhana adalah sebagai berikut:
Paket com.jvk.ken.spring; impor org.springframework.beans.factory.beanfactory; impor org.springframework.beans.factory.xml.xmleanfactory; Impor org.springframework.core.io.classpathresource; class org.springframework.core.io.classpathresource; class class public {core.coreo.classpathreSource; class publicer {coreo.classpathreSource; class class publy {testspring ();} private static void testspring () melempar Exception {beanfactory bf = new XMLBeanFactory (new ClassPathResource ("ApplicationContext.xml")); demo bean = (demo) bf.getbean ("demo"); System.out.println (bean.getClass ()); bean.printname ();}}Jalankan kelas uji dan output informasi berikut, menunjukkan bahwa contoh musim semi sederhana telah berhasil dijalankan.
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlbeandefinitionReader LoadBeandefinitions Informasi: Memuat definisi kacang xml dari sumber daya kelas [applicationContext.xml] class com.jvk.kring.spring.demo.demo Ime Ime.
Dari kode Java pendek dan file konfigurasi XML, kita dapat melihat bahwa XMLBeanFactory merakit JavaBean dengan membaca file konfigurasi XML, dan mengembalikan objek yang diperlukan ketika pengguna memanggil metode GetBean. Untuk meniru perilakunya, saya mendefinisikan beanfactory sederhana.
Paket com.jvk.ken.spring; import java.util.hashmap; impor java.util.map; kelas publik mybeanfactory {// simpan definisi peta kacang <string, class> beans = hashmap baru <string, class> (); objek publik getbean (string id iD) instantiation hash exponception, class> (); public getbean (String id iD) Instantiation hashExcepte <string, class>); Public Objek Getbean (String ID ID) Instantiation Instantiation <String, class>); Public Objek GetBean (String ID ID) Instantiation Instantiation <String, class>); Public Objek GetBean (String ID ID) Instantiation Instantiation Instantiation <String, class> (); beans.get (id) .newInstance ();} private string xmlfile; public myBeanFactory (string xmlfile) melempar classNotFoundException {super (); this.xmlfile = xmlfile; init ();} private void init () melempar ClassNotFoundException {// menginisialisasi dan parse xml, parsing aktual XML dihilangkan di sini, dan gunakan kode keras untuk meniru System.out.println ("File Konfigurasi:"+XMLFILE); String classn = class. "com.jvk.ken.spring.demo"; class <?> loadclass = this.getClass (). getClassLoader (). LoadClass (className); beans.put ("demo", loadClass);}}Kode tes adalah sebagai berikut:
Paket com.jvk.ken.spring; tes kelas publik {public static void main (string [] args) melempar pengecualian {testnotspring ();} private static void testnotspring () melempar pengecualian {mybeanfactory bf = new mybeanfactory ("applicationcontext.xml"); demo = demo = demo = demo ("applicationcontext.xml"); bf.getbean ("demo"); System.out.println (bean.getClass ()); bean.printname ();}}Setelah berjalan, informasi berikut adalah output:
File Konfigurasi: ApplicationContext.xml kelas com.jvk.ken.spring.demo saya demo.
Kode pendek di atas menunjukkan bagaimana Spring bertindak sebagai pabrik kacang paling sederhana. Mari kita sesuaikan kode sedikit di bawah untuk menganalisis apa yang terjadi di musim semi. Pertama, ubah metode konstruksi tanpa parameter dari kelas demo menjadi pribadi.
private demo () {name = "I'm Demo."; }Menjalankan kode uji mengungkapkan bahwa tidak ada perbedaan dalam hasil tes musim semi, tetapi MyBeanFactory saya yang disesuaikan melaporkan pesan kesalahan berikut:
Pengecualian di Thread "Main" java.lang.illegalAccessException: class com.jvk.ken.spring.mybeanFactory tidak dapat mengakses anggota kelas com.jvk.ken.spring.demo dengan pengubah "pribadi" di sun.reflect.reflection.ensuremembercescess (reflection (reflection. java.lang.class.newinstance0 (class.java:349) di java.lang.class.newinstance (class.java:308) di com.jvk.ken.spring.mybeanfactory.getbean (mybeanfactory.java:12) di com.jvk.ken.spring.test.testnotspring (test.java:25) di com.jvk.ken.spring.test.main (test.java:9)
Musim semi sangat ajaib? Tidak, kode yang saya tulis terlalu sederhana, dan dapat dijalankan langsung dengan sedikit modifikasi.
objek publik getBean (ID String) melempar Exception {class class1 = beans.get (id); Konstruktor DecledConstructor = class1.getDeclaredConstructor (); DecledConstructor.SetAccessible (true); return DecledConstructor.NewInstance (); }Di atas adalah Javabean paling murni yang dikelola oleh Container Musim Semi. Musim semi juga mendukung jenis kacang lain, yang disebut kacang pabrik, contohnya lebih baik dari seribu kata, silakan lihat kodenya
package com.jvk.ken.spring;import org.springframework.beans.factory.FactoryBean;public class DemoFactory implements FactoryBean {@Override public Object getObject() throws Exception {return new Demo();}@Override public Class getObjectType() {return Demo.class;}@Override public Boolean isSingleton() {return PALSU;}}Setelah menambahkan kelas Demofactory, ubah file konfigurasi pegas pada saat yang sama
<bean id = "demo" />
Kode lain tidak dimodifikasi. Setelah menjalankan kode uji, hasil output persis sama seperti sebelumnya. Mengapa kelas com.jvk.ken.spring.demofactory dengan ID dikonfigurasi, tetapi hasil yang dikembalikan adalah contoh demo? Ini karena Musim Semi mendeteksi bahwa Demofactory adalah kacang khusus yang mengimplementasikan antarmuka pabrik. Metode GetObject akan dipanggil sebelum mengembalikan hasilnya, jadi hasil akhirnya adalah objek demo. Tentu saja, jika kita benar -benar perlu mendapatkan kacang pabrik, kita bisa menulis bf.getbean ("& demo") seperti ini.
Meringkaskan
Di atas adalah semua penjelasan terperinci dari kode pembuatan Objek Implementasi Spring, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!