Jawaban:
Tidak, secara praktis saya tidak berpikir ada perbedaan tetapi ada prioritas dalam cara kerjanya. @PostConstruct, init-methodadalah BeanPostProcessors.
@PostConstruct adalah anotasi JSR-250 sementara init-method cara Spring memiliki metode inisialisasi.@PostConstructmetode, ini akan dipanggil terlebih dahulu sebelum metode inisialisasi dipanggil.afterPropertiesSet, yang pertama @PostConstructdipanggil, lalu afterPropertiesSetkemudian 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 @PostConstructanotasi untuk kode saya sendiri (karena kacang hanya dikonfigurasi dengan benar setelah metode dipanggil) dan saya gunakan init-methodsaat 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.
@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.
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:
@PostConstructakan dipanggil.InitializingBeandiimplementasikan, maka afterPropertiesSet()akan dipanggil.init-methodatau @Bean(initmethod="..")kemudian memanggil metode init.Diagram ini berasal dari Pro Spring 5: An In-Depth Guide to Spring Framework dan Tools Its
Ada mungkin perbedaan antara @PostConstructdan init-methodkarena @PostConstructditangani di postProcessAfterInitializationfase inisialisasi kacang ( AbstractAutowireCapableBeanFactory.initializeBean()metode) oleh CommonAnnotationBeanPostProcessor, sedangkan initmetode dipanggil setelah selesainya postProcessBeforeInitializationfase (dan, dalam hal ini, sebelum awal postProcessAfterInitializationfase).
EDIT : Jadi, urutannya adalah: 1) postProcessBeforeInitializationfase, 2) initmetode dipanggil, 3) postProcessAfterInitializationfase, yang memanggil @PostConstructmetode
(Sebagai catatan tambahan, pernyataan dari jawaban yang diterima
@PostConstruct, init-method adalah BeanPostProcessors
tidak sepenuhnya benar: @PostConstructditangani oleh BeanPostProcessor, initmetode tidak.)
Akan ada perbedaan jika beberapa (berpotensi kustom) BeanPostProcessor, yang dikonfigurasi dengan ( Ordered.getOrder()) untuk dieksekusi setelah CommonAnnotationBeanPostProcessor, melakukan sesuatu yang serius dalam postProcessBeforeInitializationmetodenya.
Tidak ada perbedaan apapun dengan konfigurasi Spring default BeanPostProcessorskarena semua BeanPostProcessorsyang dikonfigurasi untuk dijalankan setelahnya CommonAnnotationBeanPostProcessor, tidak melakukan apa pun dalam postProcessBeforeInitializationmetode.
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"
Kode lengkap di sini: https://github.com/wkaczurba/so8519187 ( musim semi-boot )
Menggunakan anotasi:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
Memberi kami:
Menyegarkan org.springframework.context ...
MyComponent dalam konstruktor: [null]
MyComponent di postConstruct: [Magic]
MyComponent di afterPropertiesSet: [Magic]
...
Mendaftarkan kacang untuk eksposur JMX saat startup
Memulai DemoApplication dalam 0,561 detik (JVM berjalan selama
1,011 ) Menutup org.springframework.context .. . Membatalkan pendaftaran kacang yang terkena JMX saat dimatikan
...
MyComponent di preDestroy: [Magic]