טעינת קבצי מאפיינים מחדש באביב

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

במדריך זה אנו נראה כיצד לטעון מאפיינים מחדש ביישום Spring.

2. נכסי קריאה באביב

יש לנו אפשרויות שונות לגשת לנכסים באביב:

  1. סביבה אנחנו יכולים להזריק סביבה ואז השתמש סביבה # getProperty לקרוא נכס נתון. סביבה מכיל מקורות נכסים שונים כמו מאפייני מערכת, פרמטרים, ו application.properties (.yml). כמו כן, ניתן להוסיף מקורות נכסים נוספים ל- סביבה באמצעות @PropertySource.
  2. נכסים - אנו יכולים לטעון קבצי מאפיינים ל- נכסים למשל, ואז השתמש בו בשעועית על ידי התקשרות properties.get ("נכס").
  3. @ערך אנחנו יכולים להזריק מאפיין ספציפי בשעועית עם ה- @Value ($ {‘נכס '}) ביאור.
  4. @ConfigurationProperties אנחנו יכולים להשתמש @ConfigurationProperties לטעינת תכונות היררכיות בשעועית.

3. טעינת מאפיינים מחדש מקובץ חיצוני

כדי לשנות מאפיינים בקובץ בזמן ריצה, עלינו למקם את הקובץ במקום כלשהו מחוץ לצנצנת. ואז נגיד לאביב איפה זה עם שורת הפקודהפָּרָמֶטֶר –Spring.config.location = file: // {path to file}. או שנוכל להכניס אותו application.properties.

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

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

בואו נוסיף תצורת commons שלנו pom.xml:

 commons-תצורה commons-תצורה 1.10 

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

@Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) מאפיינים ציבוריים PropertiesConfiguration PropertiesConfiguration (@Value ("$ {spring.config.location}") נתיב מחרוזת) זורק חריגה {String filePath = קובץ חדש (נתיב .substring ("file:". length ())). getCanonicalPath (); תצורת PropertiesConfiguration = PropertiesConfiguration חדשה (קובץ חדש (filePath)); configuration.setReloadingStrategy (FileChangedReloadingStrategy חדש ()); תצורת החזרה; }

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

אנו יכולים להתאים אישית את העיכוב באמצעות FileChangedReloadingStrategy # setRefreshDelay.

3.1. טוען מחדש סביבה נכסים

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

נתחיל בהרחבת ה- PropertySource:

מחלקה ציבורית ReloadablePropertySource מרחיב את PropertySource {PropertiesConfiguration propertiesConfiguration; public ReloadablePropertySource (שם מחרוזת, PropertiesConfiguration PropertiesConfiguration) {super (name); this.propertiesConfiguration = propertiesConfiguration; } ציבורי ReloadablePropertySource (שם מחרוזת, נתיב מחרוזת) {super (StringUtils.hasText (שם)? נתיב: שם); נסה את {this.propertiesConfiguration = מאפייני תצורה חדשים (נתיב); this.propertiesConfiguration.setReloadingStrategy (FileChangedReloadingStrategy חדש ()); } לתפוס (חריג e) {לזרוק PropertiesException חדש (ה); }} @Override אובייקט ציבורי getProperty (מחרוזות) {החזר מאפיינים Configuration.getProperty (ים); }}

עקפנו את getProperty שיטה להאציל אותו ל- PropertiesConfiguration # getProperty. לפיכך, הוא יבדוק אם קיימים ערכים מעודכנים במרווחים בהתאם לעיכוב הרענון שלנו.

עכשיו, אנחנו נוסיף את שלנו ReloadablePropertySource ל סביבהמקורות הנכס:

@Configuration מחלקה ציבורית ReloadablePropertySourceConfig {private ConfigurableEnvironment env; public ReloadablePropertySourceConfig (@Autowired ConfigurableEnvironment env) {this.env = env; } @Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) public ReloadablePropertySource reloadablePropertySource (PropertiesConfiguration properties) {ReloadablePropertySource ret = ReloadablePropertySource חדש (מאפיינים); מקורות MutablePropertySources = env.getPropertySources (); sources.addFirst (ret); להחזיר ret; }}

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

בואו ליצור שעועית לקרוא ממנה נכס סביבה:

@Component class class EnvironmentConfigBean {סביבת סביבה פרטית; סביבה ציבוריתConfigBean (סביבת סביבה אוטומטית) {this.environment = סביבה; } getColor מחרוזת ציבורית () {return environment.getProperty ("application.theme.color"); }}

אם עלינו להוסיף מקורות מאפיינים חיצוניים הניתנים לטעינה מחדש, ראשית עלינו ליישם את המנהג שלנו PropertySourceFactory:

מחלקה ציבורית ReloadablePropertySourceFactory מרחיב את DefaultPropertySourceFactory {@Override public PropertySource createPropertySource (String s, EncodedResource encodedResource) זורק IOException {Resource internal = encodedResource.getResource (); אם (מופע פנימי של FileSystemResource) יחזיר ReloadablePropertySource חדש (ים, ((FileSystemResource) פנימי) .getPath ()); אם (מופע פנימי של FileUrlResource) להחזיר ReloadablePropertySource חדש (ים, ((FileUrlResource) פנימי) .getURL () .getPath ()); להחזיר super.createPropertySource (s, encodedResource); }}

אז נוכל להוסיף הערה למחלקה של רכיב עם @PropertySource:

@PropertySource (value = "file: path-to-config", מפעל = ReloadablePropertySourceFactory.class)

3.2. טעינה מחדש של מופע המאפיינים

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

מחלקה ציבורית ReloadableProperties מרחיב מאפיינים {Properties PropertiesConfiguration PropertiesConfiguration; ציבורי ReloadableProperties (PropertiesConfiguration PropertiesConfiguration) זורק IOException {super.load (FileReader חדש (propertiesConfiguration.getFile ())); this.propertiesConfiguration = propertiesConfiguration; } @Override ציבורי מחרוזת getProperty (מפתח מחרוזת) {מחרוזת val = propertiesConfiguration.getString (מפתח); super.setProperty (key, val); החזרת val; } // עקיפות אחרות}

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

3.3. טוען שעועית מחדש עם @ConfigurationProperties

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

אבל, אביב ייצור רק מופע חדש של רכיבים עם אב טיפוס אוֹ בַּקָשָׁה תְחוּם.

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

3.4. טוען שעועית מחדש עם @ערך

ה @ערך ההערה מציגה את אותן מגבלות כמו @ConfigurationProperties.

4. טעינת נכסים מחדש על ידי מפעיל וענן

מפעיל האביב מספק נקודות קצה שונות לבריאות, מדדים ותצורות, אך שום דבר לרענון שעועית. לפיכך, אנו זקוקים ל- Spring Cloud כדי להוסיף a /לְרַעֲנֵן נקודת סיום אליו. נקודת קצה זו טוענת מחדש את כל מקורות הקניין של סביבה ואז מפרסם EnvironmentChangeEvent.

גם ענן האביב הציג @ RefreshScope, ואנחנו יכולים להשתמש בו לשיעורי תצורה או שעועית. כתוצאה מכך, היקף ברירת המחדל יהיה לְרַעֲנֵן במקום קְלָף בּוֹדֵד.

באמצעות לְרַעֲנֵן היקף, Spring תנקה את המטמון הפנימי שלה מרכיבים אלה ב- EnvironmentChangeEvent. ואז, בגישה הבאה לשעועית, נוצר מופע חדש.

נתחיל בהוספה קפיץ-אתחול-מתנע-מפעיל שלנו pom.xml:

 org.springframework.boot spring-boot-starter-actuator 

ואז, בואו גם נייבא תלות באביב-ענן:

   org.springframework.cloud spring-cloud-dependencies $ {spring-cloud.version} pom לייבא את גריניץ'.SR1 

ואז אנחנו מוסיפים אביב-ענן-מתנע:

 org.springframework.cloud spring-cloud-starter 

לבסוף, בואו נפעיל את נקודת הסיום לרענן:

management.endpoints.web.exposure.include = רענון

כאשר אנו משתמשים ב- Spring Cloud, אנו יכולים להגדיר שרת Config לניהול המאפיינים, אך אנו יכולים גם להמשיך עם הקבצים החיצוניים שלנו. כעת אנו יכולים להתמודד עם שתי שיטות אחרות של מאפייני קריאה: @ערך ו @ConfigurationProperties.

4.1. רענן שעועית עם @ConfigurationProperties

בואו נראה כיצד להשתמש @ConfigurationProperties עם @ RefreshScope:

@Component @ConfigurationProperties (קידומת = "application.theme") @RefreshScope מחלקה ציבורית ConfigurationPropertiesRefreshConfigBean {צבע מחרוזת פרטי; public void setColor (צבע מחרוזת) {this.color = color; } // גטר ודברים אחרים}

השעועית שלנו קוראת "צֶבַע" רכוש מהשורש "יישום.נושא" תכונה. שים לב שאנו זקוקים לשיטת הקובע, בהתאם לתיעוד של אביב.

אחרי שאנחנו משנים את הערך של "application.theme.color"בקובץ התצורה החיצוני שלנו, אנו יכולים להתקשר /לְרַעֲנֵןאז נוכל לקבל את הערך החדש מהשעועית בגישה הבאה.

4.2. רענן שעועית עם @ערך

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

@Component @ RefreshScope מחלקה ציבורית ValueRefreshConfigBean {צבע מחרוזת פרטי; ValueRefreshConfigBean (@Value ("$ {application.theme.color}") צבע מחרוזת ציבורי) {this.color = color; } // שם גטר כאן

תהליך הריענון זהה לעיל.

עם זאת, יש לציין זאת /לְרַעֲנֵן לא יעבוד עבור שעועית עם מפורש קְלָף בּוֹדֵד תְחוּם.

5. מסקנה

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

הקוד השלם זמין בפרויקט GitHub שלנו.


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