Permulaan Malas dalam Spring Boot 2

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat cara mengkonfigurasi inisialisasi malas di peringkat aplikasi, bermula dengan Spring Boot 2.2

2. Permulaan Malas

Secara lalai pada musim bunga, semua kacang yang ditentukan, dan kebergantungannya, dibuat semasa konteks aplikasi dibuat.

Sebaliknya, ketika kita mengkonfigurasi kacang dengan inisialisasi malas, kacang hanya akan dibuat, dan kebergantungannya disuntikkan, setelah diperlukan.

3. Ketergantungan Maven

Untuk mendapatkan Spring Boot 2.2 dalam aplikasi kami, kami perlu memasukkannya ke dalam classpath kami.

Dengan Maven, kita hanya boleh menambahkan pergantungan spring-boot-starter :

  org.springframework.boot spring-boot-starter 2.2.2.RELEASE   

4. Aktifkan Permulaan Malas

Spring Boot 2.2 memperkenalkan sifat spring.main.lazy-initialization , menjadikannya lebih mudah untuk mengkonfigurasi inisialisasi malas di seluruh aplikasi.

Menetapkan nilai harta menjadi benar bermaksud semua kacang dalam aplikasi akan menggunakan inisialisasi malas.

Mari konfigurasi harta tanah dalam fail konfigurasi application.yml kami :

spring: main: lazy-initialization: true

Atau, sekiranya berlaku, dalam fail application.properties kami :

spring.main.lazy-initialization=true

Konfigurasi ini mempengaruhi semua kacang dalam konteks. Oleh itu, jika kita ingin mengkonfigurasi inisial malas untuk kacang tertentu, kita dapat melakukannya melalui pendekatan @Lazy .

Lebih-lebih lagi, kita boleh menggunakan harta baru, digabungkan dengan anotasi @Lazy , ditetapkan ke false .

Atau dengan kata lain, semua kacang yang ditentukan akan menggunakan inisialisasi malas, kecuali untuk kacang yang kita konfigurasikan secara eksplisit dengan @Lazy (false) .

5. Lari

Mari buat perkhidmatan mudah yang akan membolehkan kami menguji apa yang baru kami nyatakan.

Dengan menambahkan mesej ke konstruktor, kita akan mengetahui dengan tepat kapan kacang dibuat.

public class Writer { private final String writerId; public Writer(String writerId) { this.writerId = writerId; System.out.println(writerId + " initialized!!!"); } public void write(String message) { System.out.println(writerId + ": " + message); } }

Juga, mari buat SpringApplication dan suntikan perkhidmatan yang kami buat sebelumnya.

@SpringBootApplication public class Application { @Bean("writer1") public Writer getWriter1() { return new Writer("Writer 1"); } @Bean("writer2") public Writer getWriter2() { return new Writer("Writer 2"); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); System.out.println("Application context initialized!!!"); Writer writer1 = ctx.getBean("writer1", Writer.class); writer1.write("First message"); Writer writer2 = ctx.getBean("writer2", Writer.class); writer2.write("Second message"); } }

Mari tetapkan nilai harta spring.main.lazy-inisialisasi ke false , dan jalankan aplikasi kami.

Writer 1 initialized!!! Writer 2 initialized!!! Application context initialized!!! Writer 1: First message Writer 2: Second message

Seperti yang dapat kita lihat, kacang dibuat ketika konteks aplikasi dimulai.

Sekarang mari kita ubah nilai spring.main.lazy-inisialisasi menjadi benar , dan jalankan semula aplikasi kita.

Application context initialized!!! Writer 1 initialized!!! Writer 1: First message Writer 2 initialized!!! Writer 2: Second message

Akibatnya, aplikasi tidak membuat kacang pada waktu permulaan, tetapi hanya ketika diperlukan.

6. Kesan Permulaan Malas

Mengaktifkan inisialisasi malas pada keseluruhan aplikasi boleh menghasilkan kesan positif dan negatif.

Mari kita bincangkan beberapa perkara ini, seperti yang dijelaskan dalam pengumuman rasmi mengenai fungsi baru:

  1. Permulaan yang malas dapat mengurangkan bilangan kacang yang dibuat semasa aplikasi dimulakan - oleh itu, kita dapat meningkatkan masa permulaan aplikasi
  2. Oleh kerana tidak ada biji yang dibuat sehingga diperlukan, kami dapat mengatasi masalah, menjadikannya dalam masa berjalan dan bukannya waktu permulaan
  3. Masalahnya boleh merangkumi kesalahan memori, salah konfigurasi, atau kesalahan yang ditentukan oleh kelas
  4. Juga, ketika kita berada dalam konteks web, memicu pembuatan kacang atas permintaan akan meningkatkan latensi permintaan HTTP - penciptaan kacang hanya akan mempengaruhi permintaan pertama, tetapi ini mungkin memberi kesan negatif dalam pengimbangan beban dan penskalaan otomatis .

7. Kesimpulannya

Dalam tutorial ini, kami mengkonfigurasi inisial malas dengan spring.main.lazy-inisialisasi baru, diperkenalkan pada Spring Boot 2.2.

Seperti biasa, kod sumber untuk tutorial ini terdapat di GitHub.