Inisialisasi Malas di Spring Boot 2

1. Ikhtisar

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

2. Inisialisasi Malas

Secara default di Spring, semua kacang yang ditentukan, dan dependensinya, dibuat saat konteks aplikasi dibuat.

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

3. Ketergantungan Maven

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

Dengan Maven, kita bisa menambahkan dependensi spring-boot-starter :

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

4. Aktifkan Inisialisasi Malas

Spring Boot 2.2 memperkenalkan properti spring.main.lazy-initialization , membuatnya lebih mudah untuk mengonfigurasi inisialisasi malas di seluruh aplikasi.

Menyetel nilai properti ke true berarti semua kacang dalam aplikasi akan menggunakan inisialisasi malas.

Mari kita konfigurasikan properti di file konfigurasi application.yml kita :

spring: main: lazy-initialization: true

Atau, jika demikian, dalam file application.properties kita :

spring.main.lazy-initialization=true

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

Terlebih lagi, kita bisa menggunakan properti baru, yang dikombinasikan dengan anotasi @Lazy , disetel ke false .

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

5. Jalankan

Mari buat layanan sederhana yang memungkinkan kita menguji apa yang baru saja kita jelaskan.

Dengan menambahkan pesan ke konstruktor, kita akan tahu persis 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 masukkan layanan yang telah kita 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 kita setel nilai properti spring.main.lazy-initialization ke false , dan jalankan aplikasi kita.

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

Seperti yang bisa kita lihat, kacang dibuat saat konteks aplikasi dimulai.

Sekarang mari kita ubah nilai spring.main.lazy-initialization menjadi true , dan jalankan aplikasi kita lagi.

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

Akibatnya, aplikasi tidak membuat bean pada saat startup, tetapi hanya ketika dibutuhkan.

6. Pengaruh Inisialisasi Malas

Mengaktifkan inisialisasi lambat di seluruh aplikasi dapat menghasilkan efek positif dan negatif.

Mari kita bahas beberapa di antaranya, seperti yang dijelaskan dalam pengumuman resmi fungsi baru:

  1. Inisialisasi malas dapat mengurangi jumlah kacang yang dibuat saat aplikasi dimulai - oleh karena itu, kami dapat meningkatkan waktu startup aplikasi
  2. Karena tidak ada kacang yang dibuat hingga dibutuhkan, kami dapat menutupi masalah, membuatnya dalam waktu proses alih-alih waktu mulai
  3. Masalahnya dapat mencakup kesalahan memori, kesalahan konfigurasi, atau kesalahan yang ditemukan definisi kelas
  4. Selain itu, saat kita berada dalam konteks web, memicu pembuatan kacang sesuai permintaan akan meningkatkan latensi permintaan HTTP - pembuatan kacang hanya akan memengaruhi permintaan pertama, tetapi ini mungkin berdampak negatif pada penyeimbangan beban dan penskalaan otomatis .

7. Kesimpulan

Dalam tutorial ini, kami mengonfigurasi inisialisasi malas dengan properti baru spring.main.lazy-initialization, yang diperkenalkan di Spring Boot 2.2.

Seperti biasa, kode sumber untuk tutorial ini tersedia di GitHub.