Apakah ada perbedaan antara menggunakan @PostConstruct
anotasi dan mendeklarasikan metode yang sama seperti init-method
di konfigurasi Spring XML?
Tidak, secara praktis saya tidak berpikir ada perbedaan tetapi ada prioritas dalam cara kerjanya. @PostConstruct
, init-method
adalah BeanPostProcessors.
@PostConstruct
adalah anotasi JSR-250 sementara init-method
cara Spring memiliki metode inisialisasi.@PostConstruct
metode, ini akan dipanggil terlebih dahulu sebelum metode inisialisasi dipanggil.afterPropertiesSet
, yang pertama @PostConstruct
dipanggil, lalu afterPropertiesSet
kemudian init-method
.Untuk info lebih lanjut, Anda dapat memeriksa dokumentasi referensi Spring .
Sebelum spesifikasi JSR 250, penggunaan metode-init dalam xml lebih disukai, karena ia memisahkan kelas java (kacang) dari kelas / anotasi khusus pegas apa pun. Jadi, jika Anda membangun pustaka yang tidak perlu bergantung pada kacang infrastruktur pegas maka penggunaan metode init lebih disukai. Selama metode pembuatan, Anda dapat menentukan metode yang perlu disebut sebagai metode inisialisasi.
Sekarang dengan diperkenalkannya spesifikasi JSR 250 di Java EE dan dukungan pegas untuk anotasi ini, ketergantungan pada kerangka pegas telah dikurangi sampai batas tertentu.
Tetapi saya harus mengakui bahwa penambahan hal-hal ini meningkatkan keterbacaan kode. Jadi ada pro dan kontra dari kedua pendekatan tersebut.
Tidak ada perbedaan nyata. Terserah bagaimana Anda lebih suka mengonfigurasi sistem Anda, dan itu masalah pilihan pribadi. Saya sendiri, saya lebih suka menggunakan
@PostConstruct
anotasi untuk kode saya sendiri (karena kacang hanya dikonfigurasi dengan benar setelah metode dipanggil) dan saya gunakaninit-method
saat membuat instance kacang dari pustaka non-Spring-aware (tidak dapat menerapkan anotasi di sana, tentu saja!) tetapi saya benar-benar dapat memahami orang-orang yang ingin melakukannya dengan satu atau lain cara.sumber
@postconstruct bukan bagian dari pegas. Ini adalah bagian dari paket javax. Keduanya sama. menggunakan metode-init kita perlu menambahkan dalam file xml. Jika Anda menggunakan @postconstruct menambahkan xml tidak diperlukan. Simak artikel di bawah ini.
http://answersz.com/spring-postconstruct-and-predestroy/
sumber
Seperti yang Anda lihat pada diagram di bawah ini dari Bean Creation Life-Cycle Callback .
Langkah 3 ini terjadi di Panggilan Balik Siklus Hidup Bean Creation:
@PostConstruct
akan dipanggil.InitializingBean
diimplementasikan, makaafterPropertiesSet()
akan dipanggil.init-method
atau@Bean(initmethod="..")
kemudian memanggil metode init.Diagram ini berasal dari Pro Spring 5: An In-Depth Guide to Spring Framework dan Tools Its
sumber
Ada mungkin perbedaan antara
@PostConstruct
daninit-method
karena@PostConstruct
ditangani dipostProcessAfterInitialization
fase inisialisasi kacang (AbstractAutowireCapableBeanFactory.initializeBean()
metode) olehCommonAnnotationBeanPostProcessor
, sedangkaninit
metode dipanggil setelah selesainyapostProcessBeforeInitialization
fase (dan, dalam hal ini, sebelum awalpostProcessAfterInitialization
fase).EDIT : Jadi, urutannya adalah: 1)
postProcessBeforeInitialization
fase, 2)init
metode dipanggil, 3)postProcessAfterInitialization
fase, yang memanggil@PostConstruct
metode(Sebagai catatan tambahan, pernyataan dari jawaban yang diterima
tidak sepenuhnya benar:
@PostConstruct
ditangani olehBeanPostProcessor
,init
metode tidak.)Akan ada perbedaan jika beberapa (berpotensi kustom)
BeanPostProcessor
, yang dikonfigurasi dengan (Ordered.getOrder()
) untuk dieksekusi setelahCommonAnnotationBeanPostProcessor
, melakukan sesuatu yang serius dalampostProcessBeforeInitialization
metodenya.Tidak ada perbedaan apapun dengan konfigurasi Spring default
BeanPostProcessors
karena semuaBeanPostProcessors
yang dikonfigurasi untuk dijalankan setelahnyaCommonAnnotationBeanPostProcessor
, tidak melakukan apa pun dalampostProcessBeforeInitialization
metode.Kesimpulannya, jawaban yang diterima dan yang serupa adalah benar ... dalam 99% kasus, dan posting ini hanya untuk memberi penghormatan pada konsep "iblis ada dalam detail"
sumber
Kode lengkap di sini: https://github.com/wkaczurba/so8519187 ( musim semi-boot )
Menggunakan anotasi:
Memberi kami:
sumber