הערת האביב @ConditionalOnProperty

1. סקירה כללית

במדריך הקצר הזה אנו הולכים לשפוך אור על העיקר מטרת ה @ConditionalOnProperty ביאור.

ראשית, נתחיל עם קצת רקע על מה @ConditionalOnProperty הוא. לאחר מכן, נבחן כמה דוגמאות מעשיות שיעזרו לך להבין כיצד זה עובד ואילו תכונות הוא מביא.

2. מטרת @ConditionalOnProperty

בדרך כלל, בעת פיתוח יישומים מבוססי אביב, ייתכן שיהיה עלינו ליצור כמה שעועית בהתבסס על הנוכחות והערך של מאפיין תצורה.

לדוגמה, ייתכן שנרצה לרשום א מקור מידע שעועית כדי להצביע על ייצור או מסד נתונים לבדיקה, תלוי אם הגדרנו ערך מאפיין כ- "prod" או "test".

למרבה המזל, השגה זו אינה קשה כמו שהיא נראית במבט ראשון. מסגרת האביב מספקת את @ConditionalOnProperty ביאור בדיוק למטרה זו.

בקיצור, ה @ConditionalOnProperty מאפשר רישום שעועית רק אם קיים נכס סביבה ויש לו ערך ספציפי. כברירת מחדל, יש להגדיר את המאפיין שצוין ולא להיות שווה ל- שֶׁקֶר.

עכשיו כשאנחנו מכירים את מטרת ה - @ConditionalOnProperty ביאור, בואו ונעמיק כדי לראות איך זה עובד.

3. ה @ConditionalOnProperty ביאור בפועל

כדי להדגים את השימוש ב @ConditionalOnProperty, נפתח מערכת התראות בסיסית. כדי לשמור על דברים פשוטים לעת עתה, נניח שאנחנו רוצים לשלוח הודעות דוא"ל.

ראשית, נצטרך ליצור שירות פשוט לשליחת הודעת הודעה. לדוגמה, שקול את NotificationSender מִמְשָׁק:

ממשק ציבורי NotificationSender {String send (מחרוזת הודעה); }

לאחר מכן, בוא נספק יישום של ה- NotificationSender ממשק לשליחת המיילים שלנו:

מחלקה ציבורית EmailNotification מיישמת NotificationSender {@Override ציבור מחרוזת שליחה (הודעת מחרוזת) {return "הודעת דוא"ל:" + הודעה; }}

עכשיו, בואו נראה כיצד להשתמש ב- @ConditionalOnProperty ביאור. בואו להגדיר את NotificationSender שעועית בצורה כזו שהיא תוטען רק אם הנכס notification.service מוגדר:

@Bean (name = "emailNotification") @ConditionalOnProperty (קידומת = "הודעה", שם = "שירות") ציבורי NotificationSender notificationSender () {החזר דוא"ל חדש (); }

כפי שאנו רואים, קידומת ו שֵׁם תכונות משמשות לציון מאפיין התצורה שיש לבדוק.

לבסוף, עלינו להוסיף את החלק החסר האחרון של הפאזל. בואו נגדיר את המאפיין המותאם אישית שלנו ב- application.properties קוֹבֶץ:

notification.service = דוא"ל

4. תצורה מתקדמת

כפי שכבר למדנו, @ConditionalOnProperty ביאור מאפשר לנו לרשום שעועית באופן מותנה בהתאם לנוכחות מאפיין תצורה.

עם זאת, אנו יכולים לעשות יותר מסתם זאת בהערה זו. אז בואו נחקור!

נניח שנרצה להוסיף שירות התראות נוסף - למשל שירות שיאפשר לנו לשלוח התראות SMS.

לשם כך עלינו ליצור עוד אחד NotificationSender יישום:

מחלקה ציבורית SmsNotification מיישמת את NotificationSender {@Override ציבור מחרוזת שליחה (הודעת מחרוזת) {החזרה "הודעת SMS:" + הודעה; }}

מכיוון שיש לנו שתי יישומים, בואו נראה כיצד נוכל להשתמש @ConditionalOnProperty לטעון את הימין NotificationSender שעועית בתנאי.

לשם כך, ההערה מספקת את בעל ערך תְכוּנָה. באופן די מעניין, זהמגדיר את הערך שנכס צריך שיהיה על מנת להוסיף שעועית ספציפית למיכל האביב.

עכשיו, בואו נציין באיזה מצב נרצה לרשום את הודעת SMS יישום בהקשר:

@Bean (name = "smsNotification") @ConditionalOnProperty (קידומת = "הודעה", שם = "שירות", havingValue = "sms") הודעה ציבורית MessageSenderSender2 () {להחזיר SmsNotification חדש (); }

בעזרת ה- בעל ערך תכונה, הבהרנו שאנחנו רוצים לטעון הודעת SMS רק כאשר notification.service נקבע ל סמס.

ראוי להזכיר זאת @ConditionalOnProperty יש תכונה אחרת שנקראת matchIfMissing. מאפיין זה מציין אם התנאי צריך להתאים במקרה שהנכס אינו זמין.

עכשיו בואו נחבר את כל החלקים ונכתוב מקרה מבחן פשוט כדי לאשר שהכל עובד כמצופה:

@Test ציבורי בטל כאשר ValueSetToEmail_thenCreateEmailNotification () {this.contextRunner.withPropertyValues ​​("notification.service = email") .withUserConfiguration (NotificationConfig.class) .run (context -> {assertThat (context) .hasBean ("notification); = context.getBean (EmailNotification.class); assertThat (notificationSender.send ("Hello From Baeldung!")). isEqualTo ("הודעת דוא"ל: Hello From Baeldung!"); assertThat (context) .doesNotHaveBean ("smsNotification"); }); }

5. מסקנה

במדריך קצר זה הדגשנו את מטרת השימוש ב- @ConditionalOnProperty ביאור. לאחר מכן, הצגנו דרך דוגמא מעשית כיצד להשתמש בה לטעינת שעועית ספרינג באופן מותנה.

כמו תמיד, קוד המקור המלא של הדרכה זו זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found