1. Gambaran Konfigurasi Musim Semi
1.1. Ringkasan
Spring Container membaca informasi konfigurasi kacang dari konfigurasi XML, anotasi java, dan anotasi pegas untuk membentuk registri definisi kacang;
Mendefinisikan registri untuk instantiate kacang menurut kacang;
Masukkan instance kacang ke dalam kolam cache kacang;
Aplikasi menggunakan kacang.
1.2. Konfigurasi berbasis XML
(1) Gambaran Umum File XML
xmlns -----------------------------------------------------------------------------------------------------------------------
XMLNS: XSI ------------ Standar Namespace, digunakan untuk menentukan file skema namespace khusus
xmlns: xxx = "aaaaa" ------------ namespace khusus, xxx adalah alias, dan nilai berikut AAAA adalah nama lengkapnya
XSI: SkemaLokasi -------- Tentukan file skema tertentu untuk setiap namespace, format: Alamat file nama lengkap namespace. . . Terpisah dengan spasi
2. Konfigurasi Kacang Dasar
2.1. Penamaan kacang
(1) ID dan nama dapat menentukan beberapa nama, dan nama dipisahkan oleh koma, titik koma atau spasi.
<beanname = "#car, 123, $ car" class = "xxxxxxxxx">
Pengguna dapat menggunakan getbean ("#car"), getbean ("123"), getbean ("$ mobil") untuk Getbean.
(2) Jika tidak ada atribut ID dan nama yang ditentukan, Spring akan secara otomatis menggunakan nama kelas yang sepenuhnya memenuhi syarat sebagai nama kacang
(3) Jika ada beberapa kacang anonim, yaitu, tidak ada <bean/> dengan ID dan nama yang ditentukan, dengan asumsi bahwa nama kelas yang sepenuhnya memenuhi syarat adalah xxx.
Kemudian dapatkan kacang pertama menggunakan getbean ("xxx"), dapatkan kacang kedua menggunakan getbean ("xxx#1"), dapatkan kacang ketiga menggunakan getbean ("xxx#2").
3. Injeksi ketergantungan
3.1. Suntikan atribut
(1) Injeksi atribut mengharuskan kacang untuk menyediakan konstruktor default dan memberikan metode setter untuk atribut yang perlu disuntikkan. Spring memanggil konstruktor default untuk membuat instantiate objek bean, dan kemudian memanggil metode setter untuk menyuntikkan nilai properti melalui refleksi.
(2) Musim semi hanya akan memeriksa apakah ada metode setter yang sesuai dalam kacang, dan tidak ada persyaratan yang akan dibuat apakah ada variabel atribut yang sesuai dalam kacang.
(3) Spesifikasi khusus Javabean untuk penamaan atribut: 2 huruf pertama dari suatu variabel adalah semua huruf besar atau semua huruf kecil.
3.2. Injeksi konstruktor
(1) Urutan konfigurasi parameter konstruktor tidak akan mempengaruhi hasil konfigurasi. File konfigurasi Spring mengadopsi kebijakan yang tidak terkait dengan urutan label elemen. Strategi ini dapat memastikan kepastian informasi konfigurasi sampai batas tertentu.
(2) Parameter cocok dengan indeks
Jika tipe parameter entri konstruktor adalah sama, Anda perlu menentukan indeks sekuensial parameter, jika tidak, hubungan yang sesuai tidak dapat ditentukan. menyukai:
<constructor-ArgIndex = "0" value = "xxxxxx"> <constructor-ArgIndex = "1" value = "xxxxxx">
Indeks dimulai pada 0.
(3) Masalah ketergantungan melingkar
Jika konfigurasi konstruktor 2 kacang tergantung pada pihak lain, masalah kebuntuan utas akan terjadi.
Solusinya adalah mengubah injeksi konstruktor untuk mengaitkan injeksi.
3.3. Injeksi metode pabrik
(1) Metode pabrik non-statis
Karena metode pabrik tidak statis, Anda harus terlebih dahulu membuat kacang instance dari kelas pabrik dan menggunakan kacang pabrik untuk merujuknya
<beanid = "carfactory" class = "factory class"/> <beanid = "car5" factory-bean = "carfactory" factory-method = "createCar"/>
(2) Metode pabrik statis
<beanid = "car5" class = "class factory" factory-method = "createCar"/>
3.4. Penjelasan terperinci tentang parameter injeksi
(1) 5 Karakter Khusus dalam XML
| Simbol Khusus | Urutan melarikan diri | Simbol Khusus | Urutan melarikan diri |
| < | < | "" | |
| > | > | ' | ' |
| & | & |
(2) <! [CDATA []]>
Tujuan <! [Cdata []]> adalah untuk membiarkan parser XML memperlakukan string dalam tag sebagai teks normal.
(3) Menyuntikkan nilai nol menggunakan tag <null/>
(4) Atribut Cascading
<beanid = "parent" class = "xxxxxxx"> <propertyname = "child.xxx" value = "Nilai properti objek ketergantungan"/> </bean>
Sebelum Spring3.0, anak objek ketergantungan harus dipakai terlebih dahulu, jika tidak, pengecualian akan dilemparkan. Setelah Spring3.0, tidak perlu menampilkan instantiasi. Wadah pegas akan secara otomatis instantiate objek dependensi.
(5) Gabungan Koleksi
<setMerge = "true"/>
Biasa digunakan dalam subkelas untuk menggabungkan elemen pengumpulan kelas induk
(6) Mengkonfigurasi jenis kacang koleksi melalui util namespace
Jika Anda ingin mengonfigurasi jenis kacang koleksi alih -alih properti jenis koleksi, Anda dapat mengonfigurasinya melalui util namespace.
3.5. Perakitan otomatis
(1) Elemen <bean/> memberikan atribut yang menentukan jenis autowire
3.6. Injeksi metode
Jika kita menyuntikkan kacang prototipe ke dalam kacang mode singleton dan berharap untuk mengembalikan kacang baru setiap kali kita menyebutnya, tidak mungkin untuk menggunakan metode injeksi tradisional karena aksi kacang mode singleton yang menyuntikkan kacang terkait hanya terjadi sekali.
(1) Solusi opsional adalah memungkinkan kacang host untuk mengimplementasikan antarmuka BeanfactororyAware, sehingga kacang host dapat mengakses referensi wadah, sehingga metode GET dapat dimodifikasi dan wadahnya
Metode factory.getbean ("Bean Tergantung"), Anda bisa mendapatkan kacang terbaru setiap saat.
(2) Metode di atas memasangkan kode dan pegas kami, yang merupakan cara terburuk untuk dilakukan, dan kami dapat memisahkan melalui injeksi metode.
Kita hanya perlu mendefinisikan antarmuka, dan mendefinisikan metode abstrak untuk mendapatkan kacang dependen di antarmuka. Konfigurasi pegas adalah sebagai berikut:
<beanid = "car" class = "Bean Tergantung"/> <beanid = "host" class = "interface bean"> <lookup-methodname = "getCar" bean = "car"/> </t bean>
Tag elemen metode pencarian memberikan implementasi dinamis untuk getCar () dari kacang antarmuka. Implementasi injeksi metode terutama bergantung pada teknologi bytecode operasi dinamis dari paket CGLIB.
3.7. Penggantian metode
Gunakan Bean2 untuk menggantikan metode getCar Bean1, asalkan Bean2 harus mengimplementasikan antarmuka MethodReplacer, dan konfigurasinya adalah sebagai berikut:
<beanid = "bean1" class = "aaaaaaaaa"> <diganti-metodname = "getCar" replacer = "bean2"/> </ bean> <beanid = "bean2" class = "bbbbbbbbbb"/>
4. Hubungan antara <Bean>
4.1. Warisan
Konfigurasi kacang induk dapat diwarisi oleh subkelas untuk menghindari definisi berulang. Konfigurasinya adalah sebagai berikut:
<beanid = "Parent bean" class = "aaaaaa" abstrak = "true"/> <beanid = "anak kacang" class = "bbbbbb">
Subkelas dapat mengganti konfigurasi kelas induk. Jika abstrak = "true" dari kelas induk tidak ditentukan, kacang induk akan dipakai.
4.2. Ketergantungan
Beberapa kacang instantiate bergantung pada kacang lainnya, dan kacang lainnya harus dipakai sebelum mereka dapat instantiasi kacang tuan rumah. Spring memberikan atribut yang bergantung pada, dan menentukan bahwa kacang dependensi dipakai terlebih dahulu, seperti:
<beanid = "host" class = "aaaaaa" tergantung-on = "b1"/> <beanid = "b1" class = "bbbbbbbb"/>
Jika ada beberapa kacang pra-ketergantungan, Anda dapat membuat nama kacang dengan koma, spasi, atau titik koma.
4.3. Lingkup kacang
(1) Wadah pegas akan membuat instantiasi semua kacang saat dimulai. Jika Anda tidak ingin instantiate terlebih dahulu, properti malas-init = "benar" dari <bean/> dapat mengendalikan instantiasi yang tertunda, tetapi jika kacang dirujuk oleh kacang lain yang perlu dipakai sebelumnya, musim semi juga akan mengabaikan pengaturan instantiasi yang tertunda.
(2) ruang lingkup terkait aplikasi web
Jika Pengguna menggunakan Cakupan Permintaan, Sesi, dan Globalsession, konfigurasi tambahan harus dilakukan di wadah web terlebih dahulu:
Dalam versi wadah web yang lebih rendah (sebelum servlet 2.3), Anda dapat menggunakan konfigurasi filter permintaan http:
<filter> <nilter-name> requestContextFilter </tiler-name> <nilter-class> org.springframework.web.filter.requestContextFilter </filter-class> </filter> <nilter-patping> <filter-name> requestContextFilter </filter-name> <rilter-pattern>/<filter-name>
Dalam versi wadah web yang lebih tinggi, Anda dapat menggunakan pendengar permintaan HTTP untuk mengonfigurasi:
<listener> <listener-class> org.springframework.web.context.request.requestContextListener </engeaner-class> </engeaner>
(3) Masalah Ketergantungan Lingkup
Saat menyuntikkan kacang web-scoped ke dalam singleton atau kacang prototipe, gunakan AOP, misalnya:
<bean id = "web1" scope = "request"> <aop: scoped-proxy/> </ bean> <bean id = "singleton1"> <properti name = "z1" ref = "web1"/> </ bean>
4.4. Pabrik
Secara umum, Spring menggunakan atribut kelas <bean/> untuk menentukan kacang instantiasi kelas implementasi melalui mekanisme refleksi. Tetapi dalam beberapa kasus, proses instantiasi kacang lebih rumit. Jika dengan cara tradisional, sejumlah besar informasi konfigurasi diperlukan dalam <sean>. Fleksibilitas metode konfigurasi terbatas, dan solusi sederhana dapat diperoleh dengan menggunakan metode pengkodean.
Spring menyediakan org.springframework.beans.factory.factorybean antarmuka kelas pabrik untuk ini, dan pengguna dapat menyesuaikan logika kacang instantiating dengan mengimplementasikan antarmuka ini.
Ketika kelas implementasi yang dikonfigurasi oleh atribut kelas <bean/> adalah pabrik dan subkelasnya, pengembalian metode pabrik () tidak mengembalikan pabrik dan subclassnya sendiri, tetapi objek yang dikembalikan oleh metode factorybean getObject ().
Jika Anda ingin mendapatkan objek pabrik dan subkelasnya sendiri, secara eksplisit awalkan beanname dengan awalan "&", seperti getbean ("& car5") ketika metode getbean (beanname).
5. Konfigurasi berbasis anotasi
5.1. Jenis Anotasi
@Component ----- Anotasi asli
Anotasi Derivatif:
@Repository: Annotate DAO
@Service: Layanan Label
@Controller: Pengontrol anotasi
5.2. Gunakan informasi konfigurasi anotasi untuk memulai wadah pegas
(1) Setelah musim semi 2.5, konteks namespace diperkenalkan, yang menyediakan penerapan anotasi untuk mendefinisikan kacang dengan memindai paket kelas:
<konteks: komponen-scan-package = "xxxxxxxxx" sumber daya-pola = "xxxx/*. class">
Atribut pola sumber daya digunakan untuk menentukan kelas di bawah paket tertentu yang perlu dipindai dalam paket dasar
(2) Ada sub-label filter yang lebih kuat
<konteks: komponen-scan-package = "xxxxxxxxxx"> <context: incluble-filter type = "xxxx" ekspresi = "xxxxxxxxxxxxxxxx"/> <konteks: excude-filter type = "xxxx" ekspresi = "xxxxxxxxxxxxxxxxx:" xxxxxxxxxxxxxxxx: "XXXXXXXXXXXXXXXXX:" XXXXXXXXXXXXXXXX: "XXXXXXXXXXXXXXXX:" XXXXXXXXXXXXXXX:
Dari semua jenis, kemampuan penyaringan AspectJ adalah yang paling kuat.
5.3. Perakitan kacang otomatis
(1) @Autowired
@Autowired cocok dengan tipe secara default. Jika tidak ada kacang yang cocok di dalam wadah, pengecualian akan dilemparkan ketika wadah musim semi dimulai. Anda dapat menggunakan @Autowired (wajib = false) untuk anotasi, dan tidak ada pengecualian yang akan dilemparkan.
Gunakan @Autowired untuk secara langsung memberi anotasi parameter metode. Jika suatu metode memiliki beberapa parameter, secara default, Spring secara otomatis memilih kacang yang cocok dengan jenis parameter untuk injeksi.
Menggunakan anotasi @Autowired dari variabel koleksi, Anda dapat menyuntikkan semua kacang yang cocok dengan jenis elemen koleksi, yang sangat kuat.
Menggunakan properti Assembler @Autowired, tidak ada metode setter.
(2) @QualIfiler
Jika ada lebih dari satu kacang yang cocok dalam wadah, nama kacang dapat memenuhi syarat dengan anotasi @Qualifiler.
(3) Dukungan untuk menandai dan anotasi
Spring juga mendukung @resource yang ditentukan oleh JSR-250 dan @Inject annotations yang ditentukan oleh JSR-330
@Resource mensyaratkan bahwa atribut nama kacang yang disediakan. Jika atributnya kosong, nama variabel atau nama metode akan secara otomatis digunakan sebagai nama kacang.
(4) Poin -poin penting:
Jika Anda hanya menggunakan @Autowired, kami masih perlu secara eksplisit mendefinisikan simpul <bean/> di XML. Kontainer pegas menonaktifkan perakitan anotasi secara default. Cara untuk mengaktifkannya adalah dengan mengkonfigurasi elemen <konteks: annotation-config/> di XML.
Tapi Spring juga memberikan trik lain. Menggunakan elemen <konteks: komponen-scan/>, wadah pegas akan secara otomatis mendeteksi kacang tanpa secara eksplisit mendefinisikan simpul <bean/>.
Spring Annotates the Annotation Class melalui @Component, @Repository, @Service, dan @Controller, sehingga <Context: Component-Scan/> tahu kelas mana yang perlu didaftarkan sebagai Springbean.
Jika Anda menggunakan paket JAR pihak ketiga dan Anda ingin secara otomatis menyuntikkan kelas dalam paket JAR pihak ketiga, bahkan jika Paket JAR pihak ketiga tidak membuat anotasi dengan anotasi, elemen filter <konteks: termasuk Filter> dapat menggantikan Kelas Pemindaian Komponen Berbasis Anotasi, sehingga <Konteks: Komponen Komponen/> Kelas Registers yang secara otomatis mengekspresikan ekspresi secara otomatis.
5.4. Ruang lingkup aksi dan metode proses kehidupan Bean
(1) @scope ("xxxx")
Kisaran kacang default yang dikonfigurasi oleh anotasi adalah singleton.
Spring menyediakan anotasi @scope. Ketika datang ke kelas, parameter anotasi sama dengan nilai atribut ruang lingkup dalam XML.
(2) Perbandingan metode proses kehidupan
| <Bean> | anotasi |
| init-Method | @PostConstruct |
| Metode Destory | @Predestroy |
Perbedaan: Anotasi dapat mendefinisikan beberapa metode di kelas, dan metode dijalankan secara berurutan
6. Konfigurasi Berbasis Java
6.1. Gunakan kelas Java untuk memberikan informasi definisi kacang
(1) Pojo biasa dapat memberikan informasi definisi kacang untuk kontainer musim semi selama anotasi @Configuration ditandai. Setiap metode yang ditandai dengan @Bean setara dengan memberikan informasi definisi kacang.
(2) @Bean
Jenis kacang ditentukan oleh jenis nilai pengembalian dari metode yang dijelaskan oleh @Bean
Nama default kacang sama dengan nama metode, dan juga dapat secara eksplisit ditentukan oleh @bean (name = "xxx").
Anda dapat menggunakan @scope di @bean untuk menunjukkan ruang lingkup penggunaan kacang
(3) @configuration
Karena kelas anotasi @Configuration itu sendiri telah ditandai dengan anotasi @Component, kelas mana pun yang ditandai dengan @configurstion dapat secara otomatis dirakit ke kelas lain menggunakan @Autowired.
6.2. Mulai Kontainer Musim Semi Menggunakan Informasi Konfigurasi Berdasarkan Kelas Java
(1) Spring menyediakan kelas Kontes AnnotationConfigApplicationC, yang dapat langsung memulai wadah pegas melalui kelas anotasi @Configuration yang dijelaskan.
(2) Saat ada beberapa kelas konfigurasi
Anda dapat mendaftar satu per satu melalui metode register dari annotationConfigapplicationContect, dan kemudian hubungi metode refresh untuk menyegarkan wadah untuk menerapkan kelas konfigurasi terdaftar ini.
Anda juga dapat menggunakan anotasi @import (xxx.class) untuk memperkenalkan semua kelas konfigurasi lainnya ke dalam satu kelas konfigurasi, sehingga Anda hanya perlu mendaftarkan satu kelas konfigurasi.
(3) Lihat konfigurasi @configuration melalui kelas konfigurasi XML
<konteks: komponen-scanbase-package = "..." sumber daya-pola = "nama kelas konfigurasi">
(4) Referensi informasi konfigurasi XML di kelas konfigurasi
Gunakan @Importresource ("ClassPath: ............") di @configuration untuk mengimpor file konfigurasi XML
6.3. Perbandingan 3 metode konfigurasi
| Xml | anotasi | Kelas Java |
| Kelas implementasi kacang adalah pengembangan proyek saat ini | Kontrol logika keseluruhan inisialisasi kacang melalui kode, cocok untuk skenario di mana instantiasi kacang lebih kompleks |
Meringkaskan
Di atas adalah semua penjelasan terperinci tentang kacang perakitan pegas dalam wadah IOC. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Penjelasan terperinci tentang tiga metode konfigurasi kacang di Spring 3.x
Diskusi singkat tentang perbedaan antara pola Spring Singleton Bean dan Singleton Spring
Penjelasan terperinci tentang siklus hidup penggunaan konfigurasi pegas
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!