Baru -baru ini, saya membeli buku pengantar musim semi ini: Springinaction. Saya melihat -lihat secara kasar dan merasa cukup baik. Hanya sedikit memulai. Buku Manning masih bagus. Meskipun saya tidak fokus pada Manning seperti mereka yang hanya membaca buku Manning, saya membacanya dengan hormat dan hasrat. Sekali lagi, saya menerima konsep inti musim semi seperti IOC, DI, dan AOP. Izinkan saya berbicara tentang pendapat saya tentang IOC dan DI First.
IOC (DI): Faktanya, konsep arsitektur musim semi inti tidak begitu rumit, dan tidak sama tidak jelasnya seperti yang dijelaskan dalam beberapa buku. Programmer Java semua tahu bahwa setiap logika bisnis dalam program Java membutuhkan setidaknya dua atau lebih objek untuk berkolaborasi. Secara umum, ketika setiap objek menggunakan objek mitra, ia harus menggunakan sintaks seperti newObject () untuk menyelesaikan pekerjaan aplikasi objek mitra. Anda akan menemukan bahwa kopling antar objek tinggi. Gagasan IOC adalah: Wadah Musim Semi untuk mewujudkan penciptaan dan koordinasi objek yang saling bergantung ini. Objek hanya perlu memiliki logika bisnis hubungan itu sendiri. Dalam hal ini, tanggung jawab untuk bagaimana suatu objek mendapatkan objek kolaboratifnya terbalik (IOC, DI).
Ini adalah pengalaman saya tentang IOC musim semi. Di sebenarnya cara lain untuk mengatakan IOC. DI pertama kali diusulkan oleh Martin Fowler dalam sebuah makalah pada awal 2004. Dia menyimpulkan: Apa kontrolnya terbalik? Artinya: cara mendapatkan objek dependen terbalik.
Jika Anda belum memahami konsep inti ini: di sini kami mengutip jawaban yang sederhana dan mudah dipahami yang ditemukan di blog bernama Bromon:
IOC dan DI
Pertama, saya ingin berbicara tentang IOC (InversionOfControl, Control Inversion). Ini adalah inti dari musim semi, di seluruh. Untuk kerangka kerja musim semi, Spring bertanggung jawab untuk mengendalikan siklus hidup suatu objek dan hubungan antara objek. Apa artinya ini? Untuk memberikan contoh sederhana, bagaimana kita menemukan pacar? Situasi umum adalah bahwa kita pergi ke mana-mana untuk melihat ke mana kita memiliki wanita cantik dan tampan, dan kemudian menanyakan tentang minat mereka, nomor QQ, nomor telepon, nomor IP, nomor IQ ..., temukan cara untuk mengenal mereka, memberi mereka apa yang mereka sukai, dan kemudian hehe ... proses ini kompleks dan mendalam, dan kita harus merancang dan menghadapi masing-masing tautan kita. Hal yang sama berlaku untuk pengembangan program tradisional. Dalam suatu objek, jika Anda ingin menggunakan objek lain, Anda harus mendapatkannya (baru sendiri, atau menanyakan satu dari JNDI). Setelah digunakan, objek harus dihancurkan (seperti koneksi, dll.), Dan objek akan selalu dikombinasikan dengan antarmuka atau kelas lain.
Jadi bagaimana IOC melakukannya? Ini seperti menemukan pacar melalui agen pernikahan, dan memperkenalkan pihak ketiga antara saya dan pacar saya: agen pernikahan. Badan pernikahan mengelola banyak informasi tentang pria dan wanita. Saya dapat memberikan daftar kepada agensi pernikahan dan memberi tahu pacar seperti apa yang ingin saya temukan, seperti terlihat seperti Michelle Reis, memiliki sosok seperti Lin Xilei, bernyanyi seperti Jay Chou, memiliki kecepatan seperti Carlos, dan memiliki teknologi seperti Zidane. Kemudian agen pernikahan akan memberikan MM sesuai dengan persyaratan kami. Kita hanya perlu jatuh cinta dan menikah. Sederhana dan jelas. Jika kandidat yang diberikan kepada kami tidak memenuhi persyaratan, kami akan memberikan pengecualian. Seluruh proses tidak lagi dikendalikan oleh saya, tetapi dikendalikan oleh lembaga seperti wadah seperti agen pernikahan. Ini adalah metode pengembangan yang dianjurkan oleh Spring. Semua kelas akan didaftarkan dalam wadah musim semi untuk memberi tahu Spring apa adanya dan apa yang Anda butuhkan. Maka Spring akan memberi Anda apa yang Anda inginkan ketika sistem berjalan ke level yang sesuai, dan pada saat yang sama menyerahkan Anda ke hal -hal lain yang membutuhkan Anda. Semua kelas dibuat dan dihancurkan oleh Spring, yang berarti bahwa objek yang mengontrol siklus hidup suatu objek bukan lagi objek yang merujuknya, tetapi Spring. Untuk objek tertentu, digunakan untuk mengontrol objek lain, tetapi sekarang semua objek dikendalikan oleh pegas, jadi ini disebut inversi kontrol.
Salah satu titik kunci IOC adalah secara dinamis menyediakan objek dengan objek lain yang dibutuhkan selama operasi sistem. Ini dicapai melalui DI (DependencyInjection). Misalnya, Object A perlu mengoperasikan database. Di masa lalu, kami selalu menulis kode di A untuk mendapatkan objek koneksi. Dengan Spring, kita hanya perlu memberi tahu Spring bahwa koneksi diperlukan dalam A. Mengenai cara membangun koneksi ini dan kapan membangunnya, A tidak perlu tahu. Saat sistem berjalan, Spring akan membuat koneksi pada waktu yang tepat, dan kemudian menyuntikkannya ke dalam injeksi seperti, sehingga menyelesaikan kontrol hubungan antara masing -masing objek. Kebutuhan untuk mengandalkan koneksi untuk dijalankan secara normal, dan koneksi ini disuntikkan ke dalam musim semi, dan nama injeksi ketergantungan berasal dari ini. Jadi bagaimana DI diimplementasikan? Fitur penting setelah Java 1.3 adalah refleksi, yang memungkinkan program untuk secara dinamis menghasilkan objek, menjalankan metode objek, dan mengubah properti objek saat berjalan. Musim semi disuntikkan melalui refleksi. Untuk informasi terkait tentang refleksi, silakan merujuk ke Javadoc.
Setelah memahami konsep IOC dan DI, semuanya akan menjadi sederhana dan jelas, dan sisa pekerjaan hanya untuk menumpuk blok dalam kerangka musim semi.
Mari kita pelajari cara kerja musim semi.
public static void main (string [] args) {applicationContext context = new FilesyStemXMLapPlicationContext ("ApplicationContext.xml"); Hewan hewan = (hewan) konteks.getbean ("hewan"); animal.say (); }Anda harus terbiasa dengan kode ini, tetapi mari kita menganalisisnya. Pertama, ApplicationContext.xml
<bean id = "hewan"> <name properti = "name" value = "kitty" /> </ bean>
Dia memiliki kelas phz.springframework.test.cat
Kelas publik Cat mengimplementasikan hewan {name string pribadi; public void mengatakan () {System.out.println ("I Am" + Name + "!");} public void setName (nama string) {this.name = name;}}Mengimplementasikan antarmuka phz.springframework.test
Antarmuka Animal Publik {public void mengatakan (); }Jelas kode di atas output iamkitty!
Jadi bagaimana musim semi melakukannya?
Selanjutnya, mari kita tulis Spring sendiri untuk melihat cara kerja musim semi!
Pertama, kami mendefinisikan kelas kacang, yang digunakan untuk menyimpan properti yang dimiliki oleh kacang
/ * ID kacang */ ID string privat; / * Kelas kacang */ tipe string privat; / * Properti kacang */ peta pribadi <string, objek> properti = hashmap baru <string, object> ();
Kacang termasuk ID, jenis, dan properti.
Musim semi berikutnya mulai memuat file konfigurasi kami dan menyimpan informasi konfigurasi di hashmap. Kunci hashmap adalah ID kacang dan nilai hasmap adalah kacang. Hanya dengan cara ini kita dapat memperoleh kelas hewan melalui metode Context.getbean ("Animal"). Kita semua tahu bahwa Spirng dapat menyuntikkan tipe dasar, dan dapat menyuntikkan jenis seperti daftar dan peta. Selanjutnya, mari kita ambil peta sebagai contoh untuk melihat bagaimana musim semi disimpan
Konfigurasi peta bisa seperti berikut
<bean id = "test"> <name properti = "testmap"> <peta> <entry key = "a"> <value> 1 </value> </entry> <entry key = "b"> <value> 2 </ value> </entry> </peta> </prively> </bean>
Bagaimana Spring menyimpan konfigurasi di atas? Kodenya adalah sebagai berikut:
if (beanproperty.element ("peta")! = null) {peta <string, object> propertiesmap = new HashMap <string, object> (); Elemen propertieslistMap = (elemen) beanproperty.elements (). Get (0); Iterator <?> PropertiesIterator = PropertiesListMap.elements (). Iterator (); while (propertiesIterator.hasnext ()) {element vet = (element) propertiesIterator.next (); if (vet.getName (). Equals ("entri")) {string key = vet.attributeValue ("key"); Iterator <?> valueTerator = vet.elements (). Iterator (); while (valueTerator.hasnext ()) {element value = (element) valueTerator.next (); if (value.getName (). Equals ("value")) {propertiesMap.put (key, value.getText ()); } if (value.getName (). Equals ("ref")) {propertiesmap.put (tombol, string baru [] {value.attributeValue ("bean")}); }}}} bean.getProperties (). Put (name, propertiesMap); }Selanjutnya, mari kita pergi ke bagian inti. Mari kita lihat bagaimana musim semi adalah injeksi ketergantungan. Faktanya, gagasan injeksi ketergantungan juga sangat sederhana. Ini diimplementasikan melalui mekanisme refleksi. Saat instantiasi kelas, ia menyuntikkan atribut kelas yang disimpan dalam hashmap ke dalam kelas dengan mencerminkan metode yang ditetapkan di kelas. Mari kita lihat bagaimana hal itu dilakukan.
Pertama Instantiate Kelas, seperti ini
public static Object newInstance(String className) {Class<?> cls = null;Object obj = null;try {cls = Class.forName(className);obj = cls.newInstance();}catch (ClassNotFoundException e) {throw new RuntimeException(e);}catch (InstantiationException e) {throw new RuntimeException (e);} catch (IllegalAccessException e) {lempar runtimeException baru (e);} return obj;}Kemudian menyuntikkan ketergantungan kelas ini ke dalamnya, seperti ini
public static void setProperty (objek obj, nama string, nilai string) {class <? Extends Object> clazz = obj.getClass (); coba {string methodName = returnsetMthodName (name); Method [] ms = clazz.getMethods (); untuk (metode m: ms) {if (m.getName (). Equals (MethodName)) {if (m.getParametertypes (). m.getParameterpes () [0]; setFieldValue (clazzparameterType.getName (), value, m, obj); break;}}}}} catch (SecurityException e) {throw runtimeeException (e);} tangkap (IllegalArgumentsception E) {eMaTeM; (IllegalAccessException e) {lempar runtimeException baru (e);}}Akhirnya, ia mengembalikan contoh kelas ini kepada kami dan kami dapat menggunakannya. Mari kita ambil peta sebagai contoh untuk melihat bagaimana hal itu dilakukan. Kode yang saya tulis adalah membuat hashmap dan menyuntikkan hashmap ke kelas yang perlu disuntikkan, seperti ini
if (value instanceof peta) {iterator <?> EntryIterator = ((peta <?,?>) nilai) .Entryset (). iterator (); Peta <string, object> peta = hashmap baru <string, object> (); while (entryiterator.hasnext ()) {entry <?,?> entrymap = (entri <?,?>) EntryTerator.next (); if (entrymap.getValue () instanceof string []) {map.put ((string) entrymap.getKey (), getBean (((string []) entrymap.getValue ()) [0])); }} Beanprocesser.setProperty (obj, properti, peta); }Oke, jadi kami dapat menggunakan Spring untuk membuat kelas untuk kami. Bukankah itu sulit? Tentu saja musim semi dapat melakukan lebih dari ini. Contoh program ini hanya menyediakan bagian dari fungsi injeksi ketergantungan inti paling banyak musim semi.
Artikel ini telah merujuk sejumlah besar artikel dan tidak dapat berterima kasih kepada Anda satu per satu. Terima kasih di sini bersama. Saya minta maaf atas pelanggaran hak cipta Anda. Saya harap ini akan membantu semua orang!
Meringkaskan
Di atas adalah semua isi artikel ini tentang penjelasan terperinci tentang prinsip -prinsip IOC musim semi, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Pemahaman singkat tentang contoh IOC, AOP, dan kode musim semi
Pengantar Detail untuk Implementasi Simulasi IOC Musim Semi
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!