Anotasi Spring @ConditionalOnProperty

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menjelaskan tujuan utama anotasi @ConditionalOnProperty .

Pertama, kita akan mulai dengan sedikit latar belakang tentang apa itu @ConditionalOnProperty . Kemudian, kita akan melihat beberapa contoh praktis untuk membantu memahami cara kerjanya dan fitur apa yang dibawanya.

2. Tujuan @ConditionalOnProperty

Biasanya, saat mengembangkan aplikasi berbasis Spring, kita mungkin perlu membuat beberapa bean secara bersyarat berdasarkan keberadaan dan nilai properti konfigurasi .

Sebagai contoh, kita mungkin ingin mendaftarkan bean DataSource untuk diarahkan ke produksi atau database uji tergantung pada apakah kita menetapkan nilai properti ke "prod" atau "test".

Untungnya, mencapai itu tidak sesulit yang terlihat pada pandangan pertama. Framework Spring menyediakan anotasi @ConditionalOnProperty secara tepat untuk tujuan ini.

Singkatnya, @ConditionalOnProperty mengaktifkan pendaftaran kacang hanya jika properti lingkungan ada dan memiliki nilai tertentu. Secara default, properti yang ditentukan harus ditentukan dan tidak sama dengan false .

Sekarang setelah kita terbiasa dengan tujuan anotasi @ConditionalOnProperty , mari kita gali lebih dalam untuk melihat cara kerjanya.

3. Anotasi @ConditionalOnProperty dalam Praktik

Untuk mencontohkan penggunaan @ConditionalOnProperty, kami akan mengembangkan sistem notifikasi dasar. Untuk menyederhanakannya untuk saat ini, anggap saja kita ingin mengirim notifikasi email.

Pertama, kita perlu membuat layanan sederhana untuk mengirim pesan notifikasi. Misalnya, pertimbangkan antarmuka NotificationSender :

public interface NotificationSender { String send(String message); }

Selanjutnya, mari kita berikan implementasi antarmuka NotificationSender untuk mengirim email kita:

public class EmailNotification implements NotificationSender { @Override public String send(String message) { return "Email Notification: " + message; } }

Sekarang, mari kita lihat cara menggunakan anotasi @ConditionalOnProperty . Mari kita konfigurasikan kacang NotificationSender sedemikian rupa sehingga hanya akan dimuat jika properti notification.service didefinisikan :

@Bean(name = "emailNotification") @ConditionalOnProperty(prefix = "notification", name = "service") public NotificationSender notificationSender() { return new EmailNotification(); }

Seperti yang bisa kita lihat, atribut prefix dan name digunakan untuk menunjukkan properti konfigurasi yang harus diperiksa .

Akhirnya, kita perlu menambahkan potongan teka-teki terakhir yang hilang. Mari kita definisikan properti khusus kita di file application.properties :

notification.service=email

4. Konfigurasi Lanjutan

Seperti yang telah kita pelajari, anotasi @ConditionalOnProperty memungkinkan kita untuk mendaftarkan kacang secara kondisional bergantung pada keberadaan properti konfigurasi.

Namun, kami dapat melakukan lebih dari itu dengan anotasi ini . Jadi, mari kita jelajahi!

Misalkan kita ingin menambahkan layanan pemberitahuan lain - misalnya, layanan yang memungkinkan kita mengirim pemberitahuan SMS.

Untuk melakukan itu, kita perlu membuat implementasi NotificationSender lain :

public class SmsNotification implements NotificationSender { @Override public String send(String message) { return "SMS Notification: " + message; } }

Karena kita memiliki dua implementasi, mari kita lihat bagaimana kita bisa menggunakan @ConditionalOnProperty untuk memuat kacang NotificationSender yang benar secara kondisional.

Untuk tujuan ini, anotasi menyediakan atribut havingValue . Cukup menarik, ini mendefinisikan nilai yang harus dimiliki properti agar kacang tertentu dapat ditambahkan ke wadah Spring .

Sekarang, mari tentukan dalam kondisi apa kita ingin mendaftarkan implementasi SmsNotification dalam konteks:

@Bean(name = "smsNotification") @ConditionalOnProperty(prefix = "notification", name = "service", havingValue = "sms") public NotificationSender notificationSender2() { return new SmsNotification(); }

Dengan bantuan atribut havingValue , kami memperjelas bahwa kami ingin memuat SmsNotification hanya ketika notification.service disetel ke sms .

Perlu disebutkan bahwa @ConditionalOnProperty memiliki atribut lain yang disebut matchIfMissing . Atribut ini menentukan apakah kondisi harus cocok jika properti tidak tersedia .

Sekarang, mari gabungkan semua bagian dan tulis kasus uji sederhana untuk mengonfirmasi bahwa semuanya berfungsi seperti yang diharapkan:

@Test public void whenValueSetToEmail_thenCreateEmailNotification() { this.contextRunner.withPropertyValues("notification.service=email") .withUserConfiguration(NotificationConfig.class) .run(context -> { assertThat(context).hasBean("emailNotification"); NotificationSender notificationSender = context.getBean(EmailNotification.class); assertThat(notificationSender.send("Hello From Baeldung!")).isEqualTo("Email Notification: Hello From Baeldung!"); assertThat(context).doesNotHaveBean("smsNotification"); }); }

5. Kesimpulan

Dalam tutorial singkat ini, kami menyoroti tujuan penggunaan anotasi @ConditionalOnProperty . Kemudian, kami memamerkan, melalui contoh praktis, bagaimana menggunakannya untuk memuat kacang pegas secara kondisional.

Seperti biasa, kode sumber lengkap dari tutorial ini tersedia di GitHub.