נכסים עם אביב ומגף אביב

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

הדרכה זו תוצג כיצד להגדיר ולהשתמש בנכסים באביב באמצעות תצורת Java ו- @PropertySource.

נראה גם כיצד נכסים עובדים באביב אתחול.

2. רשום קובץ מאפיינים באמצעות הערות

גם אביב 3.1 מציג החדש @PropertySource ביאור כמנגנון נוח להוספת מקורות רכוש לסביבה.

אנו יכולים להשתמש בהערה זו בשילוב עם ה- @תְצוּרָה ביאור:

@Configuration @PropertySource ("classpath: foo.properties") מחלקה ציבורית PropertiesWithJavaConfig {// ...}

דרך שימושית נוספת לרישום קובץ מאפיינים חדש היא שימוש במציין מיקום, המאפשר לנו בחר באופן דינמי את הקובץ הנכון בזמן הריצה:

@PropertySource ({"classpath: persistence - $ {envTarget: mysql} .properties"}) ...

2.1. הגדרת מיקומי נכסים מרובים

ה @PropertySource ניתן לחזור על ביאור על פי מוסכמות Java 8. לכן, אם אנו משתמשים ב- Java 8 ומעלה, אנו יכולים להשתמש בהערה זו כדי להגדיר מיקומי נכסים מרובים:

@PropertySource ("classpath: foo.properties") @PropertySource ("classpath: bar.properties") מחלקה ציבורית PropertiesWithJavaConfig {// ...}

כמובן, אנחנו יכולים גם להשתמש ב- @PropertySources ביאור וציין מערך של @PropertySource. זה עובד בכל גרסת Java נתמכת, לא רק ב- Java 8 ומעלה:

@PropertySources ({@PropertySource ("classpath: foo.properties"), @PropertySource ("classpath: bar.properties")}) Class class PropertiesWithJavaConfig {// ...}

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

3. שימוש / הזרקת מאפיינים

הזרקת נכס עם @ערך ביאור הוא פשוט:

@Value ("$ {jdbc.url}") מחרוזת פרטית jdbcUrl;

אנו יכולים גם לציין ערך ברירת מחדל עבור הנכס:

@Value ("$ {jdbc.url: aDefaultUrl}") מחרוזת פרטית jdbcUrl;

החדש PropertySourcesPlaceholderConfigurer נוסף באביב 3.1 לפתור $ {...} מצייני מיקום בתוך ערכי מאפייני הגדרת שעועית ו @ערך ביאורים.

לבסוף, אנחנו יכולים להשיג את ערך הנכס באמצעות סביבה ממשק API:

@ סביבה פרטית אוטומטית מאושרת; ... dataSource.setUrl (env.getProperty ("jdbc.url"));

4. נכסים עם מגף קפיץ

לפני שנכנס לאפשרויות תצורה מתקדמות יותר עבור מאפיינים, בואו נבזבז זמן מה לבחון את תמיכת המאפיינים החדשה ב- Spring Boot.

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

4.1. application.properties: קובץ המאפיינים המוגדר כברירת מחדל

Boot מיישם את המוסכמה האופיינית שלה על גישת תצורה על קבצי נכסים. זה אומר ש אנחנו יכולים פשוט לשים application.properties קובץ שלנו src / main / resources הספרייה, והיא תגלה אוטומטית. לאחר מכן נוכל להזריק כל מאפיין טעון ממנו כרגיל.

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

אנו יכולים גם להגדיר קובץ אחר בזמן ריצה אם נצטרך, באמצעות מאפיין סביבה:

java -jar app.jar --spring.config.location = classpath: /another-location.properties

החל באביב אתחול 2.3, אנו יכולים גם לציין מיקומי תווים כלליים עבור קבצי תצורה.

לדוגמא, אנו יכולים להגדיר את ה- spring.config.location נכס ל config / * /:

java -jar app.jar --spring.config.location = config / * /

בדרך זו, Spring Boot יחפש קבצי תצורה התואמים ל- config / * / דפוס ספריה מחוץ לקובץ הצנצנת שלנו. זה שימושי כאשר יש לנו מספר מקורות של מאפייני תצורה.

מאז הגרסה 2.4.0, Spring Boot תומך בשימוש בקבצי מאפיינים מרובי מסמכים, בדומה ל- YAML לפי עיצוב:

baeldung.customProperty = ערך ברירת מחדל # --- baeldung.customProperty = overriddenValue

שים לב שלקבצי מאפיינים, לפני סימון שלוש המקפים תו הערה (#).

4.2. קובץ מאפיינים ספציפיים לסביבה

אם עלינו למקד לסביבות שונות, יש מנגנון מובנה לכך ב- Boot.

אנחנו יכולים פשוט להגדיר יישומים- environment.properties קובץ ב- src / main / resources הספרייה, ולאחר מכן הגדר פרופיל אביב עם שם הסביבה זהה.

לדוגמה, אם אנו מגדירים סביבה "מבוי", פירוש הדבר שנצטרך להגדיר a הַצָגָה פרופיל ואז יישום- staging.properties.

קובץ env זה ייטען ו יקדימו את קובץ הנכס המוגדר כברירת מחדל. שים לב שקובץ ברירת המחדל עדיין נטען, רק שכאשר יש התנגשות בנכס, קובץ המאפיינים הספציפי מקבל עדיפות.

4.3. קובץ מאפיינים ספציפיים למבחן

ייתכן שיש לנו גם דרישה להשתמש בערכי נכסים שונים כאשר היישום שלנו נמצא בבדיקה.

מגף האביב מטפל בכך עבורנו על ידי הסתכלות שלנו src / test / resources ספריה במהלך ריצת מבחן. שוב, מאפייני ברירת המחדל עדיין יהיו ניתנים להזרקה כרגיל, אך הם יעקפו על ידי אלה אם תהיה התנגשות.

4.4. ה @TestPropertySource ביאור

אם אנו זקוקים לבקרה מדויקת יותר על מאפייני הבדיקה, נוכל להשתמש ב- @TestPropertySource ביאור.

זה מאפשר לנו להגדיר מאפייני בדיקה להקשר ספציפי לבדיקה, תוך עדיפות על פני מקורות הנכסים המוגדרים כברירת מחדל:

@RunWith (SpringRunner.class) @TestPropertySource ("/ foo.properties") בכיתה ציבורית FilePropertyInjectionUnitTest {@Value ("$ {foo}") פרטי מחרוזת foo; @Test הציבור בטל כאשר FilePropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

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

@RunWith (SpringRunner.class) @TestPropertySource (property = {"foo = bar"}) class public PropertyInjectionUnitTest {@Value ("$ {foo}") פרטי מחרוזת foo; @ מבחן ציבורי בטל כאשרPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

אנו יכולים גם להשיג אפקט דומה באמצעות ה- נכסים הטיעון של @ SpringBootTest ביאור:

@RunWith (SpringRunner.class) @SpringBootTest (מאפיינים = {"foo = bar"}, classes = SpringBootPropertiesTestApplication.class) בכיתה ציבורית SpringBootPropertyInjectionIntegrationTest {@Value ("$ {foo}") פרטי מחרוזת מחרוזת; @ מבחן פומבי בטל כאשר SpringBootPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

4.5. מאפיינים היררכיים

אם יש לנו מאפיינים המקובצים יחד, נוכל להשתמש ב- @ConfigurationProperties ביאור, אשר ימפה את היררכיות המאפיינים הללו לגרפים של אובייקטים של Java.

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

database.url = jdbc: postgresql: / localhost: 5432 / מופע database.username = foo database.password = סרגל

ואז נשתמש בהערה כדי למפות אותם לאובייקט מסד נתונים:

@ConfigurationProperties (קידומת = "מסד נתונים") מסד נתונים ציבורי בכיתה {String url; שם משתמש מחרוזת; סיסמת מחרוזת; // סטרים וקובעים סטנדרטיים}

Spring Boot מחיל את הקונבנציונציה שלה על גישת התצורה שוב, ומפות אוטומטית בין שמות הנכסים והשדות המתאימים להם. כל מה שאנחנו צריכים לספק הוא קידומת הנכס.

אם אתה רוצה להעמיק במאפייני התצורה, עיין במאמר המעמיק שלנו.

4.6. חלופה: קבצי YAML

אביב תומך גם בקבצי YAML.

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

YAML טוב במיוחד לאחסון נכסים היררכי; קובץ המאפיינים הבא:

database.url = jdbc: postgresql: / localhost: 5432 / מופע database.username = foo database.password = סוד סרגל: foo

הוא שם נרדף לקובץ YAML הבא:

מסד נתונים: url: jdbc: postgresql: / localhost: 5432 / שם משתמש למשל: foo סיסמה: סוד בר: foo

ראוי גם להזכיר שקבצי YAML אינם תומכים ב- @PropertySource ביאור, כך שאם נצטרך להשתמש בהערה זו, זה יגביל אותנו להשתמש בקובץ מאפיינים.

נקודה מדהימה נוספת היא שבגרסת 2.4.0 Spring Boot שינתה את אופן טעינת המאפיינים מקבצי YAML מרובי מסמכים. בעבר, סדר הוספתם התבסס על סדר הפעלת הפרופיל. עם הגרסה החדשה, עם זאת, המסגרת נוהגת על פי כללי הסדר עליהם ציינו קודם לכן .נכסים קבצים; מאפיינים שהוכרזו נמוכים יותר בקובץ פשוט עוקפים את המאפיינים הגבוהים יותר.

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

4.7. ייבוא ​​קבצי תצורה נוספים

לפני גרסה 2.4.0, Spring Boot מותר לכלול קבצי תצורה נוספים באמצעות spring.config.location ו spring.config.additional-location נכסים, אך היו להם מגבלות מסוימות. לדוגמא, היה צריך להגדיר אותם לפני תחילת היישום (כמאפייני סביבה או מערכת, או באמצעות ארגומנטים של שורת פקודה) כפי שהשתמשו בהם מוקדם בתהליך.

בגרסה המוזכרת, אנחנו יכולים להשתמש ב- spring.config.import נכס בתוך application.properties אוֹ application.yml קובץ כדי לכלול בקלות קבצים נוספים. מאפיין זה תומך בכמה תכונות מעניינות:

  • הוספת מספר קבצים או ספריות
  • ניתן לטעון את הקבצים דרך הכיתה או מספרייה חיצונית
  • המציין אם תהליך ההפעלה ייכשל אם לא נמצא קובץ, או שמדובר בקובץ אופציונלי
  • ייבוא ​​קבצים ללא הרחבה

בואו נראה דוגמה חוקית:

spring.config.import = classpath: נוסף- application.properties, classpath: יישום נוסף [.yml], אופציונלי: file: ./ external.properties, classpath: יישום נוסף-מאפייני /

הערה: כאן עיצבנו מאפיין זה באמצעות מעברי שורות רק לשם הבהרה.

אביב יתייחס ליבוא כאל מסמך חדש שהוכנס מיד מתחת להצהרת הייבוא.

4.8. מאפיינים מטענות שורת פקודה

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

java -jar app.jar --property = "value"

אנו יכולים לעשות זאת באמצעות מאפייני מערכת, המסופקים לפני -קַנקַן פקודה ולא אחריה:

java -Dproperty.name = "value" -jar app.jar

4.9. מאפיינים מתוך משתני סביבה

Spring Boot יאתר גם משתני סביבה ויתייחס אליהם כאל מאפיינים:

שם יצוא = ערך java -jar app.jar 

4.10. אקראיות של ערכי נכס

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

random.number = $ {random.int} random.long = $ {random.long} random.uuid = $ {random.uuid}

4.11. סוגים נוספים של מקורות נכס

Spring Boot תומך בהמון מקורות נכסים, ומיישם הזמנה מחושבת היטב כדי לאפשר עקיפה הגיונית. כדאי לעיין בתיעוד הרשמי, שמרחיק לכת מהיקף המאמר.

5. תצורה באמצעות שעועית גולמית - PropertySourcesPlaceholderConfigurer

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

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

בואו נראה כיצד אנו יכולים להגדיר שעועית זו באמצעות תצורת Java:

@Bean מאפיינים סטטיים ציבוריים של PropertySourcesPlaceholderConfigurer () {PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer (); משאבים [] משאבים = חדש ClassPathResource [] {חדש ClassPathResource ("foo.properties")}; pspc.setLocations (משאבים); pspc.setIgnoreUnresolvablePlaceholders (true); החזר pspc; }

6. מאפיינים בהקשרים של הורה וילד

שאלה זו עולה שוב ושוב: מה קורה כאשר שלנו ליישום אינטרנט יש הורה והקשר של ילד? בהקשר האב יכול להיות כמה פונקציונליות ליבה משותפת ושעועית, ואז הקשר (או מרובה) ילד אחד, אולי מכיל שעועית ספציפית לשרת.

במקרה כזה, מה הדרך הטובה ביותר להגדיר קבצי מאפיינים ולכלול אותם בהקשרים אלה? וכיצד ניתן לאחזר נכסים אלו בצורה הטובה ביותר מאביב?

אנו ניתן פירוט פשוט.

אם הקובץ הוא מוגדר בהקשר של ההורה:

  • @ערך עובד ב הקשר ילדים: כן
  • @ערך עובד ב הקשר ההורי: כן
  • environment.getProperty ב הקשר ילדים: כן
  • environment.getProperty ב הקשר ההורי: כן

אם הקובץ הוא מוגדר בהקשר הילד:

  • @ערך עובד ב הקשר ילדים: כן
  • @ערך עובד ב הקשר ההורי: לא
  • environment.getProperty ב הקשר ילדים: כן
  • environment.getProperty ב הקשר ההורי: לא

7. מסקנה

מאמר זה הראה מספר דוגמאות לעבודה עם קבצי מאפיינים ומאפיינים באביב.

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