אירועי אביב

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

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

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

יש כמה הנחיות פשוטות שיש לבצע:

  • האירוע צריך להאריך ApplicationEvent
  • על המו"ל להזרים ApplicationEventPublisher לְהִתְנַגֵד
  • על המאזין ליישם את יישום מאזין מִמְשָׁק

2. אירוע בהתאמה אישית

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

2.1. אירוע יישום פשוט

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

מחלקה ציבורית CustomSpringEvent מרחיב את ApplicationEvent {הודעת מחרוזת פרטית; ציבורי CustomSpringEvent (מקור אובייקט, הודעת מחרוזת) {super (source); הודעה זו = הודעה; } מחרוזת getMessage ציבורית () {הודעה חוזרת; }}

2.2. מפרסם

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

כדי לפרסם את האירוע, המו"ל יכול פשוט להזריק את ApplicationEventPublisher והשתמש ב- publishEvent () ממשק API:

מחלקה ציבורית @Component CustomSpringEventPublisher {@Autowired פרטי ApplicationEventPublisher applicationEventPublisher; public void publishCustomEvent (הודעת מחרוזת סופית) {System.out.println ("פרסום אירוע מותאם אישית."); CustomSpringEvent customSpringEvent = CustomSpringEvent חדש (זה, הודעה); applicationEventPublisher.publishEvent (customSpringEvent); }}

לחלופין, מחלקת המפרסמים יכולה ליישם את ה- ApplicationEventPublisherAware ממשק - זה גם יזריק את מפרסם האירועים בהפעלת היישום. בדרך כלל, פשוט פשוט להזריק למו"ל @Autowire.

2.3. מאזין

לבסוף, בואו ניצור את המאזין.

הדרישה היחידה עבור המאזין היא להיות שעועית וליישם יישום מאזין מִמְשָׁק:

מחלקה ציבורית @Component CustomSpringEventListener מיישם את ApplicationListener {@Override public void onApplicationEvent (אירוע CustomSpringEvent) {System.out.println ("אירוע מותאם אישית באביב התקבל -" + event.getMessage ()); }}

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

וכפי שכבר דנו - כברירת מחדל אירועי האביב הם סינכרוניים - ה doStuffAndPublishAnEvent () שיטות חסימות עד שכל המאזינים יסיימו לעבד את האירוע.

3. יצירת אירועים אסינכרוניים

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

אתה יכול להפעיל את זה בתצורה על ידי יצירת ApplicationEventMulticaster שעועית עם מוציא להורג; לענייננו כאן SimpleAsyncTaskExecutor עובד טוב:

@Configuration public class AsynchronousSpringEventsConfig {@Bean (name = "applicationEventMulticaster") public ApplicationEventMulticaster simpleApplicationEventMulticaster () {SimpleApplicationEventMulticaster eventMulticaster = חדש SimpleApplicationEventMulticaster (); eventMulticaster.setTaskExecutor (חדש SimpleAsyncTaskExecutor ()); אירוע חזרה Multicaster; }}

האירוע, המו"ל והמימושים של המאזינים נשארים כקודם - אבל עכשיו, המאזין יטפל באירוע אסינכרוני בשרשור נפרד.

4. אירועי מסגרת קיימים

אביב עצמו מפרסם מגוון אירועים מהקופסה. לדוגמא, ה ApplicationContext יפטור אירועי מסגרת שונים. לְמָשָׁל. ContextRefreshedEvent, ContextStartedEvent, RequestHandledEvent וכו '

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

הנה דוגמה מהירה למאזין המאזין לרענון הקשר:

מחלקה ציבורית ContextRefreshedListener מיישמת את ApplicationListener {@Override public void onApplicationEvent (ContextRefreshedEvent cse) {System.out.println ("טיפול באירוע רענן מחדש של ההקשר."); }}

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

5. מאזין לאירועים מונע ביאורים

החל באביב 4.2, מאזין לאירועים אינו נדרש להיות שעועית המיישמת את יישום מאזין ממשק - ניתן לרשום אותו בכל אחד פּוּמְבֵּי שיטה של ​​שעועית מנוהלת באמצעות @EventListener ביאור:

@Component public class AnnotationDrivenEventListener {@EventListener public void handleContextStart (ContextStartedEvent cse) {System.out.println ("טיפול באירוע שהתחיל הקשר."); }}

כמו בעבר, חתימת השיטה מצהירה על סוג האירוע שהיא צורכת.

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

6. תמיכה בגנריות

אפשר גם לשלוח אירועים עם מידע גנרי בסוג האירוע.

6.1. אירוע יישום כללי

בואו ניצור סוג אירועים כללי. בדוגמה שלנו, שיעור האירועים מכיל כל תוכן ו הַצלָחָה מחוון מצב:

מחלקה ציבורית GenericSpringEvent {private T what; הצלחה בוליאנית מוגנת; Public GenericSpringEvent (T what, הצלחה בוליאנית) {this.what = what; this.success = הצלחה; } // ... גטרים סטנדרטיים}

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

6.2. מאזין

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

מחלקה ציבורית @Component GenericSpringEventListener מיישם את ApplicationListener {@ ביטול חלל ציבורי ב- ApplicationEvent (@NonNull GenericSpringEvent event) {System.out.println ("אירוע גנרי באביב שהתקבל -" + event.getWhat ()); }}

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

אפשר גם תנאי למאזין האירוע על ידי הגדרת ביטוי SpEL בוליאני ב- @EventListener ביאור. במקרה זה, המטפל באירועים יופעל רק למוצלח GenericSpringEvent שֶׁל חוּט:

@Component public class AnnotationDrivenEventListener {@EventListener (condition = "# event.success") handled public voidSuccessful (GenericSpringEvent) {System.out.println ("טיפול באירוע כללי (מותנה)."); }}

שפת הביטוי האביבית (SpEL) היא שפת ביטוי עוצמתית המכוסה בפירוט במדריך אחר.

6.3. מפרסם

מפרסם האירועים דומה לזה שתואר לעיל. אך עקב מחיקת סוגים, עלינו לפרסם אירוע הפותר את הפרמטר הגנרי עליו היינו מסננים. לדוגמה, class GenericStringSpringEvent מרחיב את GenericSpringEvent.

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

7. אירועי קשרי עסקה

פסקה זו עוסקת בשימוש ב- @TransactionalEventListener ביאור. למידע נוסף על ניהול עסקאות, עיין במדריך Transactions with Spring ו- JPA.

מאז אביב 4.2 המסגרת מספקת חדש @TransactionalEventListener ביאור, שהוא הרחבה של @EventListener, המאפשר כריכה של המאזין לאירוע לשלב העסקה. הכריכה אפשרית לשלבי העסקה הבאים:

  • AFTER_COMMIT (ברירת מחדל) משמש להפעלת האירוע אם העסקה נעשתה הושלם בהצלחה
  • AFTER_ROLLBACK - אם העסקה קיימת התהפך לאחור
  • AFTER_COMPLETION - אם העסקה קיימת הושלם (כינוי עבור AFTER_COMMIT ו AFTER_ROLLBACK)
  • BEFORE_COMMIT משמש להפעלת האירוע נכון לפני עִסקָה לְבַצֵעַ

הנה דוגמה מהירה למאזין אירועים לעסקאות:

@TransactionalEventListener (phase = TransactionPhase.BEFORE_COMMIT) handled public voidCustom (אירוע CustomSpringEvent) {System.out.println ("טיפול באירוע בתוך עסקה לפני התחייבות."); }

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

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

8. מסקנה

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

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

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

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


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