Anotasi Spring @ConditionalOnProperty

1. Gambaran keseluruhan

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

Pertama, kita akan mulakan dengan sedikit latar belakang mengenai apa itu @ConditionalOnProperty . Kemudian, kita akan melihat beberapa contoh praktikal untuk membantu memahami cara kerjanya dan ciri yang dibawanya.

2. Tujuan @ConditionalOnProperty

Biasanya, semasa mengembangkan aplikasi berasaskan Spring, kita mungkin perlu membuat beberapa biji berdasarkan syarat dan nilai properti konfigurasi .

Sebagai contoh, kami mungkin ingin mendaftarkan kacang DataSource untuk menunjuk ke pangkalan data produksi atau ujian bergantung pada apakah kami menetapkan nilai properti ke "prod" atau "test".

Nasib baik, mencapainya tidak semudah yang dilihat pada pandangan pertama. Kerangka Spring menyediakan anotasi @ConditionalOnProperty tepat untuk tujuan ini.

Ringkasnya, @ConditionalOnProperty membolehkan pendaftaran kacang hanya jika harta tanah ada dan mempunyai nilai tertentu. Secara lalai, harta yang ditentukan mesti ditentukan dan tidak sama dengan yang salah .

Sekarang kita sudah biasa dengan tujuan penjelasan @ConditionalOnProperty , mari kita menggali lebih mendalam untuk melihat bagaimana ia berfungsi.

3. Anotasi @ConditionalOnProperty dalam Amalan

Sebagai contoh penggunaan @ConditionalOnProperty, kami akan membangunkan sistem pemberitahuan asas. Untuk memastikan perkara-perkara mudah buat masa ini, mari kita anggap bahawa kita ingin menghantar pemberitahuan e-mel.

Pertama, kita perlu membuat perkhidmatan mudah untuk menghantar mesej pemberitahuan. Sebagai contoh, pertimbangkan antara muka NotificationSender :

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

Seterusnya, mari sediakan pelaksanaan antara muka NotificationSender untuk menghantar e-mel kami:

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

Sekarang, mari kita lihat bagaimana memanfaatkan anotasi @ConditionalOnProperty . Mari konfigurasikan kacang NotificationSender sedemikian rupa sehingga hanya akan dimuat jika pemberitahuan harta tanah . Perkhidmatan ditentukan :

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

Seperti yang kita lihat, atribut awalan dan nama digunakan untuk menunjukkan sifat konfigurasi yang harus diperiksa .

Akhirnya, kita perlu menambahkan potongan teka-teki yang terakhir. Mari tentukan harta tersuai kami dalam fail application.properties :

notification.service=email

4. Konfigurasi Lanjutan

Seperti yang telah kita ketahui, anotasi @ConditionalOnProperty membolehkan kita mendaftarkan kacang dengan syarat bergantung pada kehadiran harta benda konfigurasi.

Walau bagaimanapun, kami dapat melakukan lebih daripada sekadar penjelasan ini . Oleh itu, mari kita meneroka!

Anggaplah kita mahu menambahkan perkhidmatan pemberitahuan lain - sebagai contoh, perkhidmatan yang membolehkan kita menghantar pemberitahuan SMS.

Untuk melakukan itu, kita perlu membuat pelaksanaan NotificationSender yang lain :

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

Oleh kerana kita mempunyai dua pelaksanaan, mari kita lihat bagaimana kita dapat menggunakan @ConditionalOnProperty untuk memuatkan notificationSender bean yang betul secara bersyarat.

Untuk tujuan ini, anotasi memberikan atribut havingValue . Cukup menarik, ia menentukan nilai yang mesti dimiliki harta tanah agar kacang tertentu ditambahkan ke bekas Spring .

Sekarang, mari kita tentukan dalam keadaan apa kita ingin mendaftarkan pelaksanaan SmsNotification dalam konteks:

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

Dengan bantuan atribut havingValue , kami menjelaskan bahawa kami ingin memuatkan SmsNotification hanya apabila pemberitahuan.servis diset ke sms .

Perlu disebutkan bahawa @ConditionalOnProperty mempunyai atribut lain yang disebut matchIfMissing . Atribut ini menentukan sama ada syaratnya sesuai sekiranya harta tanah tidak tersedia .

Sekarang, mari kita satukan semua bahagian dan tulis kes ujian mudah untuk mengesahkan bahawa 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 ringkas ini, kami menyoroti tujuan penggunaan anotasi @ConditionalOnProperty . Kemudian, kami mempamerkan, melalui contoh praktikal, cara menggunakannya untuk memuatkan biji kacang dengan syarat.

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