Profil konfigurasi application.yml pertama adalah sebagai berikut:
Proyek Maven pom.xml menambahkan paket:
Buat objek baru yang dipetakan dengan kode berikut:
Jenis string harus memerlukan setter untuk menerima nilai properti; Peta, koleksi, dan array tidak diperlukan
Gunakan anotasi @Autowired untuk menyuntikkan secara otomatis, seperti yang ditunjukkan pada gambar berikut:
esConfig selalu mengeluarkan null, mencari solusi untuk waktu yang lama, tetapi gagal, akan ada solusi di bawah ini.
Mari kita buat pengontrol baru, kodenya adalah sebagai berikut:
Injeksi berhasil, dan nilai file konfigurasi yml diperoleh secara normal, sebagai berikut:
Alasan mengapa EsClient tidak dapat berhasil disuntikkan adalah sebagai berikut:
Panggil fungsi kelas ini di konstruktor, dan variabel @Autowired kelas ini digunakan dalam fungsi ini.
Jadi saya pikir itu mungkin salah. Karena @Autowired harus menunggu kelas dibangun sebelum dapat diatur dari referensi eksternal. Oleh karena itu, waktu injeksi @Autowired harus lebih lambat dari waktu eksekusi konstruktor. Larutan:
Tim Musim Semi merekomendasikan "Selalu gunakan injeksi dependensi berbasis konstruktor di kacang Anda. Selalu gunakan pernyataan untuk dependensi wajib".
Terjemahan:
Spring menyarankan: "Selalu tetapkan injeksi ketergantungan dengan konstruktor di kacang Anda. selalu gunakan pernyataan untuk memaksa ketergantungan".
Tulisan asli:
Tulisan yang dimodifikasi:
PS: Urutan inisialisasi variabel Java adalah: variabel statis atau blok pernyataan statis – variabel > instance atau blok pernyataan inisialisasi – metode >konstruksi – >@Autowired
Jadi mengapa menambahkan tipe akhir ke variabel anggota?
Ada penjelasan di Internet sebagai berikut: Ruang lingkup kacang default dalam konfigurasi pegas adalah singleton, yang selalu ada setelah startup. Deklarasikan objek bean untuk dibuat secara dinamis dengan mengatur properti cakupan ke prototipe. Namun, jika layanan Anda sendiri adalah singleton, injeksi hanya dijalankan sekali.
@Autowired itu sendiri adalah mode singleton, itu hanya akan dijalankan sekali saat program dimulai, dan tidak akan menginisialisasi untuk kedua kalinya meskipun tidak menentukan final, jadi final ini tidak ada artinya.
Ini mungkin untuk mencegah konstruktor dieksekusi lagi saat program sedang berjalan;
Atau mungkin lebih mudah dipahami, ditambah final hanya akan diinisialisasi sekali saat program dimulai.
|