Artikel ini terutama merangkum beberapa metode panggilan balik dan poin yang dapat diperluas yang disediakan oleh Spring Container sebelum dan sesudah menginisialisasi instance. Dengan menggunakan metode ini dan titik ekstensi, beberapa pemrosesan logis khusus dapat dilakukan sebelum dan sesudah inisialisasi musim semi.
Berikut ini terutama diperkenalkan:
Inisialisasi Siklus Hidup Tingkat Level Metode Callback Metode Init-Metode Konfigurasi, Inisialisasi Antarmuka dan Anotasi Postconstruct
Ekstensi Level Kontainer Antarmuka BeanPostProcessor dan antarmuka BeanFactoryPostProcessor
1. Panggilan balik siklus hidup tingkat kelas
1.1Init-Method
Referensi: Springbeanxsdinit-Method
Init-Method adalah item konfigurasi saat mendeklarasikan kacang di file konfigurasi pegas. Nilai item konfigurasi init-metode adalah metode tanpa parameter di kelas, tetapi pengecualian dapat dilemparkan. Metode ini akan dipanggil setelah Container Spring Instantiates objek dan menetapkan nilai properti.
Fungsi yang dapat diimplementasikan dengan metode init konsisten dengan antarmuka inisialisasi dan anotasi postconstruct
File Konfigurasi Musim Semi dan Kelas Uji adalah sebagai berikut:
<bean id = "initmethodbeanservice" init-method = "init"> <name properti = "f2" value = "2"/> </tacer>
Kelas tes adalah sebagai berikut:
public class InitMethodBeanService {private static Integer f1;private Integer f2;static {f1 = 1;System.out.println("InitMethodBeanService static block execute...");}public InitMethodBeanService(){System.out.println("InitMethodBeanService construct method execute...");}public void init () {System.out.println ("InitMethoDBeansEver Init Metode Execute ...");} Public Integer getF2 () {return f2;} public void setf2 (integer f2) {this.f2 = f2; System.out.println ("initmethodbeans setF2 Metode service =" (");Hasil eksekusi dicetak sebagai berikut:
Initmethodbeanservice static block execute ... initmethodbeanservice method konstruk
1.2InitializingBean Interface
Referensi: Dokumen resmi Musim Semi Kacang-Kacang-Lifecycle-InitializingBean
Antarmuka InitializingBean menyatakan metode setelah PROPERTERTERIESSET, yang dipanggil setelah Spring Container instantiates objek dan menetapkan nilai properti. Ini konsisten dengan fungsionalitas yang diimplementasikan di atas metode init, jadi Spring tidak merekomendasikan penggunaan antarmuka inisialisasi.
Contohnya relatif sederhana, tidak terdaftar
1.3PostConstruct Anotasi
Terjemahan: Dokumen Resmi Musim Semi Postconstruct-and-Predestroy-Annotations
@PostConstruct Anotasi adalah metode panggilan balik siklus hidup yang konsisten dengan implementasi antarmuka Init-Method dan InitializingBean.
@PostConstructPublic void postconstruct () {System.out.println ("Metode PostConstructService Postconstruct Metode Execute ...");}Ringkas Tiga Siklus Hidup di atas metode panggilan balik init-Method, Inisialisasi Antarmuka, @PostConstruct Anotasi
1. Semua dipakai dan diproses untuk kelas tunggal
2. Waktu eksekusi dipanggil setelah instantiasi kelas dan variabel anggota disuntikkan.
3. Untuk metode init, Anda juga dapat mengonfigurasi metode inisialisasi default di bawah elemen kacang dari file konfigurasi pegas, dan item konfigurasi adalah metode-masuk default
4. Jika metode inisialisasi yang dikonfigurasi dalam tiga metode di atas berbeda, urutan eksekusi adalah: @PostConstruct Metode Anotasi> InitializingBean AfterPropertiesset> Metode Init-Method; Jika metode yang dikonfigurasi dalam tiga metode adalah sama, metode ini hanya akan dieksekusi sekali (lihat: Efek Dokumen Resmi Spring-Factory-Lifecycle-Combined-Effect)
5. Ada metode panggilan balik awal, dan ada juga metode panggilan balik yang hancur. @PostConstruct Metode Anotasi> InitializingBean's Afterpropertiesset> Metode Init-Method sesuai dengan metode anotasi @predestroy> Destroyebean Destroy> Destroy-Method Metode
2. Ekstensi Level Kontainer
Terjemahan: Dokumen Resmi Musim Semi 3.8ContainerExtensionPoints
Secara umum, pengembang tidak perlu menyesuaikan subclass dari ApplicationContext untuk memperluas wadah springioc. Wadah Springioc dapat mencapai perluasan wadah Springioc melalui beberapa antarmuka yang terbuka.
2.1BeanPostProcessor Antarmuka
2.1.1 inisialisasi inisialisasi rantai postprocessor dan postprocessor
Antarmuka BeanPostProcessor mendefinisikan dua metode panggilan balik level kontainer postprocessBeforeInitialization dan postprocessafterinitialization, yang digunakan untuk beberapa pemrosesan logis setelah menginisialisasi instance dan akan diproses untuk semua instance dalam wadah. Kelas yang mengimplementasikan antarmuka beanpostprocessor disebut inisialisasi inisialisasi bean postprocessor.
Jika beberapa inisialisasi inisialisasi postprosesor diintegrasikan ke dalam wadah Springioc, himpunan postprosesor ini disebut inisialisasi inisialisasi Bean Rantai postprocessor.
Metode postprocessBeforeInitialisasi dieksekusi setelah instantiasi kelas dan injeksi variabel anggota selesai, dan sebelum metode inisialisasi (seperti Metode AfterPropertiesset Afterpropertiesset))
Metode postprocessafterinitialisasi dieksekusi setelah instantiasi kelas dan injeksi variabel anggota selesai, dan metode inisialisasi (seperti Metode AfterPropertiesset dari InitializeBean) dijalankan setelahnya
Meringkaskan:
1. Inisialisasi inisialisasi inisialisasi sebagian besar digunakan untuk beberapa operasi proxy pada instance. Beberapa fitur yang menggunakan AOP di musim semi juga diimplementasikan melalui pasca-prosesor.
2. Inisialisasi inisialisasi rantai pasca prosesor adalah beberapa pasca-prosesor, dan akan ada masalah dengan perintah eksekusi. Anda dapat mengimplementasikan antarmuka yang dipesan untuk menentukan urutan eksekusi pasca-pemrosesan. Antarmuka yang dipesan menyatakan metode GetOrder. Semakin kecil nilai pengembalian metode, semakin tinggi prioritas pasca pemrosesan dan eksekusi sebelumnya.
3. Saat menginisialisasi postprocessor dengan mengimplementasikan antarmuka BeanPostProcessor, disarankan untuk mengimplementasikan antarmuka yang dipesan dan menentukan prioritas.
4. Ruang lingkup postprosesor ini adalah wadah Springioc saat ini, yaitu, wadah springioc yang dinyatakan postprocessor. Untuk wadah Springioc dengan struktur hierarkis, rantai prosesor setelah inisialisasi inisialisasi tidak bertindak pada instance yang diinisialisasi oleh wadah lain, bahkan jika kedua wadah berada pada hierarki yang sama.
5. Kelas implementasi inisialisasi instalisasi pasca prosesor hanya perlu dinyatakan sama dengan kacang yang dikelola musim semi biasa. Wadah Springioc akan secara otomatis mendeteksinya dan menambahkannya ke inisialisasi inisialisasi rantai pasca prosesor.
6. Dibandingkan dengan deteksi otomatis, kami juga dapat memanggil metode AddBeanPostProcessor dari Konfigurasi yang dapat dikonfigurasi. Ini lebih praktis dalam skenario di mana penambahan kondisi perlu ditentukan. Pendekatan pemrograman ini mengabaikan urutan yang ditentukan oleh antarmuka yang dipesan, tetapi akan bertindak pada semua contoh yang secara otomatis terdeteksi sebelum inisialisasi pasca-prosesor.
2.1.2 Inisialisasi Inisialisasi Bean Postprocessor dan AOP
BeanPostProcessor adalah antarmuka khusus, dan kelas yang mengimplementasikan antarmuka ini akan digunakan sebagai postprocessor untuk contoh kacang yang dikelola musim semi. Oleh karena itu, pada tahap khusus startup konteks aplikasi musim semi, semua contoh yang mengimplementasikan antarmuka BeanPostProcessor akan secara langsung diinisialisasi, dan kelas -kelas yang dirujuk oleh instance juga akan dipakai. Kemudian sebagai postprocessor untuk diterapkan pada instance normal lainnya.
Karena proxy otomatis AOP diimplementasikan dalam bentuk instantiating postprocessors, baik instance kacang tidak menginisialisasi instance rantai postprocessor atau instance yang direferensikan dapat secara otomatis diproksi. Oleh karena itu, jangan menenun wajah pada contoh -contoh ini. (Untuk contoh ini, pesan log akan dihasilkan: "Kelas Foo tidak dapat diproses oleh semua rantai postprocessor yang dipakai, yaitu tidak dapat secara otomatis diproksi").
CATATAN: Ketika Instantiation Postprocessor mengacu pada kacang lain dalam bentuk autowiring atau @Resource, wadah musim semi dapat menyuntikkan kacang yang tidak ditentukan ketika disuntikkan dengan ketergantungan jenis yang cocok (misalnya, tidak ada namanya dengan namanya. akan disuntikkan dalam bentuk pencocokan tipe, dan kacang yang tidak ditentukan dapat disuntikkan saat ini). Ini juga dapat menyebabkan proksi otomatis atau metode pemrosesan postprosessor instantiasi lainnya gagal.
2.1.3 Contoh Inisialisasi Inisialisasi Post Prosesor
Kelas Publik BeanPostProcessorService mengimplementasikan beanpostprocessor {@override objek publik postprocessafterinitialization (objek o, string s) melempar beansException {System.out.println ("Objok ObyprocessorsorsB@Objek Objek@Objok Objok@ String s) melempar beansException {system.out.println ("BeanPostProcessorService PostProcessBeforeInitialization Metode Execute ..."); return o;}}2.2BeanFactoryPostProcessor antarmuka
2.2.1 postprocessor beanfactory
Dengan menerapkan antarmuka BeanFactoryPostProcessor, Anda dapat membaca metadata konfigurasi kacang yang dikelola oleh wadah dan membuat perubahan sebelum kacang dipakai. Kacang -kacang ini disebut postprosesor beanfactory.
Persamaan dan perbedaan antara beanfactorypostprocessors dan antarmuka beanpostprocessor:
Kesamaan:
Semua adalah postprosesor tingkat kontainer
Semua dapat dikonfigurasi dengan beberapa postprocessor, dan urutan eksekusi ditentukan dengan mengimplementasikan antarmuka yang dipesan.
Mereka diproses untuk kacang yang dikelola dalam wadah yang dinyatakan oleh antarmuka. Dalam wadah dengan struktur hierarkis, kacang -kacangan dalam wadah lain tidak dapat diproses, bahkan jika kedua wadah berada pada tingkat yang sama.
Semuanya hanya perlu dinyatakan dalam wadah seperti kacang biasa. Wadah akan secara otomatis mendeteksi dan mendaftar sebagai postprocessor.
Tunda inisialisasi konfigurasi properti akan diabaikan
Perbedaan:
Antarmuka BeanFactoryPostProcessors memproses metadata konfigurasi kacang sebelum instantiasi kacang, dan antarmuka beanpostprocessor memproses contoh kacang setelah instantiasi kacang **
Antarmuka BeanFactoryPostProcessors juga dapat memperoleh contoh kacang melalui metode beanfactory.getBean (), yang akan menyebabkan kacang dipakai. Since the BeanFactoryPostProcessors postprocessor is executed before all beans are instantiated, the BeanFactory.getBean() method will cause the bean to be instantiated in advance, thus breaking the life cycle of the container standard, which may cause some negative impacts (for example, the bean instantiated in advance will ignore the processing of the bean instantiated postprocessor).
2.2.2 pegas built-in dan postprocessor beanfactory khusus
Spring memiliki postprosesor beanfactory built-in (misalnya: PropertyplaceHolderConfigurer dan PropertyOverrideconfigurer). Ini juga mendukung implementasi antarmuka BeanFactoryPostProcessor dan menyesuaikan postprocessor beanfactory. Mari kita bicara tentang postprocessors dan postprosesor kustom Spring.
PropertPlaceHolderConfigurer
Untuk menghindari risiko yang disebabkan oleh modifikasi file definisi XML utama, Spring memberikan pemisahan konfigurasi, dan dapat mengonfigurasi beberapa variabel yang dapat diubah menjadi file konfigurasi properti dan merujuknya dalam file definisi XML sebagai tempat penampung. Dengan cara ini, memodifikasi konfigurasi hanya perlu memodifikasi file konfigurasi atribut. PropertyplaceHolderConfigurer digunakan untuk mendeteksi placeholder dan mengganti placeholder dengan nilai properti konfigurasi. Contohnya adalah sebagai berikut:
PropertyplaceHolderConfigurer menggunakan file konfigurasi properti jdbc.properties untuk menggantikan placeholder properti untuk informasi terkait database dalam kacang data data dengan nilai konfigurasi yang sesuai saat runtime.
Konfigurasi XML adalah sebagai berikut:
<bean> <name properti = "lokasi" value = "classpath: com/foo/jdbc.properties"/> </bean> <bean id = "DataSource" Destroy-Method = "Tutup"> <nama properti = "driverclassname" value = "$ {jdbc.driverclassname}"/<"value =" $ {jdbc.driverclassname} "/<" value = "$ {jdbc.driverclassname}"/" value = "$ {jdbc.url}"/> <name properti = "username" value = "$ {jdbc.username}"/> <name properti = "kata sandi" value = "$ {jdbc.password}"/>File Konfigurasi Atribut JDBC.Properties adalah sebagai berikut:
jdbc.driverclassname = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // produksi: 9002jdbc.username = sajdbc.password = root
PropertyplaceHolderConfigurer tidak hanya mendukung pembacaan file konfigurasi properti, tetapi juga mendukung pembacaan properti sistem. Prioritas baca dapat dikonfigurasi melalui nilai properti SystemPropertiesMode. Berbagai nilai dijelaskan sebagai berikut:
0: Jangan Baca Properti Sistem
1: Jika konfigurasi untuk placeholder yang sesuai tidak diambil dalam file konfigurasi atribut yang direferensikan, atribut sistem dibaca. Default adalah 1
2: Baca atribut sistem terlebih dahulu, dan kemudian baca file konfigurasi atribut yang direferensikan. Konfigurasi ini dapat menyebabkan properti sistem menimpa file konfigurasi.
PropertyOverrideconfigurer
Kelas PropertyOverrideconfigurer dapat secara langsung menetapkan nilai ke kacang dalam wadah dengan merujuk pada file konfigurasi properti. Ketika properti Bean ditetapkan oleh beberapa instance kelas PropertyOverrideconfigurer, nilai terakhir mengesampingkan yang sebelumnya.
Menetapkan kacang sumber data di atas sebagai contoh:
Kelas PropertyOverrideconfigurer menggunakan cara baru untuk merujuk file konfigurasi properti, sebagai berikut:
<konteks: Lokasi properti-override = "classpath: override.properties"/>
Aturan penamaan properti override.properties file konfigurasi properti berbeda dari yang di atas (dalam contoh di atas, perlu untuk memastikan bahwa nama properti dan placeholder konsisten), dan aturan penamaannya adalah beanname.property
DataSource.DriverClassName = com.mysql.jdbc.driverDataSource.url = jdbc: mysql: mydbdataSource.username = sadataSource.password = root
Mendukung penugasan atribut komposit, tetapi memastikan bahwa objek yang merujuk atribut yang ditetapkan tidak kosong, misalnya: foo.fred.bob.sammy = 123
Post Processor Pabrik Kustom
Pabrik pos pabrik kustom mengimplementasikan antarmuka BeanFactoryPostProcessor untuk menyelesaikan modifikasi metadata konfigurasi kacang yang dikelola oleh Spring Container. Sebagai contoh: Ubah nilai yang disuntikkan oleh atribut kelas, contohnya adalah sebagai berikut:
Tentukan pengguna kelas pengguna
Public Class UserBean {Private String username; string publik getUserName () {return username;} public void setusername (string username) {this.username = username;}}File Konfigurasi XML Musim Semi Mengkonfigurasi kelas pengguna dan menyuntikkan nilai haha ke nama pengguna atribut nama pengguna
<bean/> <bean id = "user"> <properti name = "username" value = "haha"/> </ bean>
Di bawah ini adalah postprocessor pabrik kacang khusus, memodifikasi nilai nama pengguna properti menjadi heihei
Public Class BeanFactoryPostProcessorService mengimplementasikan BeanFactoryPostProcessor {@Override public void postprocessbeanfactory (configurableListableBeanFactory beanfactory) lemparan; "Systemsorporyfactory (" beanfactorypostorypostorypostorypospeption {System.Out Beandefinition bd = beanfactory.getBeandefinition ("user"); MutablePropertyValues pv = bd.getPropertyValues (); if (pv.contains ("username")) {pv.addpropertyvalue ("nama pengguna", "heihei"); }}}Meringkaskan
Di atas adalah semua penjelasan terperinci tentang panggilan siklus hidup musim semi dan ekstensi wadah dalam artikel ini. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Diskusi singkat tentang penerapan anotasi khusus di musim semi
Analisis Kode IOC Musim Semi
Contoh Kode Penggunaan Handler Interceptor SpringMVC
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!