Apakah ada fitur Spring 3 untuk menjalankan beberapa metode saat aplikasi dimulai untuk pertama kalinya? Saya tahu bahwa saya dapat melakukan trik pengaturan metode dengan@Scheduled
anotasi dan dijalankan setelah startup, tetapi kemudian akan dieksekusi secara berkala.
176
Jawaban:
Jika dengan "startup aplikasi" yang Anda maksudkan dengan "startup konteks aplikasi", maka ya, ada banyak cara untuk melakukan ini , yang paling mudah (untuk kacang lajang, tetap) dengan menjelaskan metode Anda
@PostConstruct
. Lihatlah tautan untuk melihat opsi lain, tetapi secara ringkas mereka adalah:@PostConstruct
afterPropertiesSet()
seperti yang didefinisikan olehInitializingBean
antarmuka panggilan balikSecara teknis, ini adalah kait ke dalam siklus hidup kacang , bukan siklus hidup konteks, tetapi dalam 99% kasus, keduanya setara.
Jika Anda perlu menghubungkan secara khusus ke konteks startup / shutdown, maka Anda dapat mengimplementasikan
Lifecycle
antarmuka , tetapi itu mungkin tidak perlu.sumber
Access restriction: The type PostConstruct is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/rt.jar
@PostConstruct
metodenya disebut, tetapi infra-struktur JMS yang secara tidak langsung tergantung padanya belum sepenuhnya terhubung (dan menjadi Spring semuanya gagal secara diam-diam). Saat beralih ke@EventListener(ApplicationReadyEvent.class)
semuanya berfungsi (ApplicationReadyEvent
adalah Spring Boot khusus untuk vanilla Spring lihat jawaban Stefan).Ini mudah dilakukan dengan
ApplicationListener
. Saya mendapatkan ini untuk bekerja mendengarkan SpringContextRefreshedEvent
:Pendengar aplikasi berjalan secara sinkron di Musim Semi. Jika Anda ingin memastikan kode Anda dieksekusi hanya sekali, simpan saja beberapa status di komponen Anda.
MEMPERBARUI
Dimulai dengan Spring 4.2+ Anda juga dapat menggunakan
@EventListener
anotasi untuk mengamatiContextRefreshedEvent
(terima kasih kepada @bphilipnyc untuk menunjukkan ini):sumber
ContextStartedEvent
, lebih sulit untuk menambahkan pendengar sebelum acara dimulai.Di Spring 4.2+ sekarang Anda bisa melakukan:
sumber
Jika Anda menggunakan spring-boot, ini adalah jawaban terbaik.
Saya merasa bahwa
@PostConstruct
dan berbagai interupsi siklus hidup adalah cara-cara bulat. Ini dapat menyebabkan masalah runtime secara langsung atau menyebabkan cacat yang kurang jelas karena peristiwa siklus hidup kacang / konteks yang tidak terduga. Mengapa tidak langsung memohon kacang Anda menggunakan Java biasa? Anda masih memanggil kacang dengan 'cara pegas' (mis: melalui proxy pegas AoP). Dan yang terbaik, itu java biasa, tidak bisa lebih sederhana dari itu. Tidak perlu pendengar konteks atau penjadwal aneh.sumber
main()
sama sekali, misalnya saat menggunakan kerangka kerja aplikasi (misalnya JavaServer Faces).Untuk pengguna Java 1.8 yang mendapatkan peringatan ketika mencoba mereferensikan anotasi @PostConstruct, saya malah malah membuntuti anotasi @Jadwal yang dapat Anda lakukan jika Anda sudah memiliki pekerjaan @Jadwal dengan fixedRate atau fixedDelay.
sumber
Apa yang kami lakukan adalah memperluas
org.springframework.web.context.ContextLoaderListener
untuk mencetak sesuatu ketika konteksnya dimulai.Konfigurasikan subclass lalu di
web.xml
:sumber
Dengan SpringBoot, kita dapat menjalankan metode saat startup melalui
@EventListener
anotasisumber
Anda juga dapat menggunakan metode terjadwal dengan fixedDelay yang diatur sangat tinggi
Ini memiliki keuntungan bahwa seluruh aplikasi terhubung (Transaksi, Dao, ...)
terlihat di Penjadwalan tugas untuk dijalankan sekali, menggunakan namespace tugas Musim Semi
sumber
@PostConstruct
?Diposting solusi lain yang mengimplementasikan WebApplicationInitializer dan dipanggil jauh sebelum kacang apa pun dipakai, jika seseorang memiliki kasus penggunaan itu
Inisialisasi Lokal default dan Zona Waktu dengan konfigurasi Spring
sumber
sumber
Jika Anda ingin mengonfigurasi kacang sebelum aplikasi Anda berjalan sepenuhnya, Anda dapat menggunakan
@Autowired
:sumber
Anda dapat menggunakan
@EventListener
komponen Anda, yang akan dipanggil setelah server dimulai dan semua kacang diinisialisasi.sumber
Untuk file yang
StartupHousekeeper.java
ada dalam paketcom.app.startup
,Lakukan ini di
StartupHousekeeper.java
:Dan lakukan ini di
myDispatcher-servlet.java
:sumber