מבוא למודל התראות האירועים ב- CDI 2.0

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

CDI (Contexts and Dependency Injection) היא המסגרת הסטנדרטית של הזרקת תלות בפלטפורמת EE של ג'קרטה.

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

2. התלות של Maven

כדי להתחיל, נבנה פרויקט פשוט של Maven.

אנו זקוקים למיכל תואם CDI 2.0, ו- Weld, יישום הייחוס של CDI, מתאים מאוד:

  javax.enterprise cdi-api 2.0.SP1 org.jboss.weld.se weld-se-core 3.0.5. 

כרגיל, אנו יכולים למשוך את הגרסאות העדכניות ביותר של cdi-api ו לרתך-ליבה ממייבען סנטרל.

3. התבוננות וטיפול באירועים בהתאמה אישית

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

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

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

3.1. כיתת שירות בסיסית

נתחיל ביצירת פשוט טקסטשירות מעמד:

class class TextService {public String parseText (טקסט מחרוזת) {return text.toUpperCase (); }} 

3.2. שיעור אירועים בהתאמה אישית

לאחר מכן, בואו נגדיר מחלקת אירועים לדוגמה, שלוקחת a חוּט טיעון בבנאיו:

מחלקה ציבורית ExampleEvent {private final String eventMessage; exampleEvent public (מחרוזת eventMessage) {this.eventMessage = eventMessage; } // גטר}

3.3. הגדרת שיטת תצפיתנית עם @ שומר ביאור

כעת, לאחר שהגדרנו את שיעורי השירות והאירועים שלנו, בואו נשתמש ב- @ שומר ביאור ליצירת שיטת צופה עבורנו דוגמא לאירוע מעמד:

מחלקה ציבורית ExampleEventObserver {public String onEvent (@Observes ExampleEvent event, TextService textService) {return textService.parseText (event.getEventMessage ()); }}

בעוד ממבט ראשון, יישום ה- onEvent () השיטה נראית טריוויאלית למדי, והיא למעשה מקיפה הרבה פונקציונליות דרך @ שומר ביאור.

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

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

3.4. אתחול מיכל ה- CDI 2.0 שלנו

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

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

SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance (); נסה (מיכל SeContainer = containerInitializer.initialize ()) {container.getBeanManager (). fireEvent (דוגמא חדשה Event ("ברוך הבא לבאלדונג!")); }

שים לב שאנחנו משתמשים ב- SeContainerInitializer ו מיכל SeContainer אובייקטים מכיוון שאנחנו משתמשים ב- CDI בסביבת Java SE, ולא בג'קרטה EE.

כל שיטות הצופה המצורפות יקבלו הודעה כאשר ה- דוגמא לאירוע מפוטר על ידי הפצת האירוע עצמו.

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

בְּקִצוּר נִמרָץ, יש לנו את היתרונות של מיכל IoC בטוח מסוג, יחד עם מודל התראות עשיר בתכונות.

4. ה מיכל יוזם מִקרֶה

בדוגמה הקודמת השתמשנו באירוע מותאם אישית כדי להעביר אירוע לשיטת צופה ולקבל אתחול מלא TextService לְהִתְנַגֵד.

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

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

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

בואו נסתכל כיצד אנו יכולים להשתמש ב- מיכל יוזם אירוע להעברת השליטה למערכת דוגמא EventEbserver מעמד:

מחלקה ציבורית ExampleEventObserver {public String onEvent (@Observes ContainerInitialized event, TextService textService) {return textService.parseText (event.getEventMessage ()); }} 

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

5. שיטות תצפיתניות מותנות

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

כמו כן, אנו יכולים להגדיר שיטת צופה מותנה על ידי ציון notifyObserver = IF_EXISTS כטיעון ל @ שומר על ביאור:

מחרוזת ציבורית onEvent (@Observes (notifyObserver = IF_EXISTS) אירוע ExampleEvent, TextService textService) {להחזיר textService.parseText (event.getEventMessage ()); } 

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

6. שיטות תצפיתניות

אנו יכולים גם להפעיל אירועים במסגרת עסקה, כגון עדכון מסד נתונים או פעולת הסרה. לשם כך, אנו יכולים להגדיר שיטות צופה בעסקאות על ידי הוספת ה- בְּמַהֲלָך ויכוח ל @ שומר על ביאור.

כל ערך אפשרי של בְּמַהֲלָך ארגומנט מתאים לשלב מסוים של עסקה:

  • לפני ההשלמה
  • AFTER_COMPLETION
  • AFTER_SUCCESS
  • AFTER_FAILURE

אם נפטר את ExampleEvent אירוע בתוך עסקה, עלינו לשקף מחדש את onEvent () שיטה בהתאם לטיפול באירוע בשלב הנדרש:

מחרוזת ציבורית onEvent (@Observes (במהלך = AFTER_COMPLETION) אירוע דוגמא של אירוע, TextService textService) {החזר textService.parseText (event.getEventMessage ()); }

שיטת צופה בעסקאות תקבל הודעה על האירוע שסופק רק בשלב ההתאמה של עסקה נתונה.

7. הזמנת שיטות צופה

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

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

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

מחלקה ציבורית AnotherExampleEventObserver {public String onEvent (@Observes ExampleEvent event) {return event.getEventMessage (); }}

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

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

מחרוזת ציבורית onEvent (@Observes @Priority (1) אירוע דוגמאתאירוע, TextService textService) {// ... יישום} 
מחרוזת ציבורית onEvent (@Observes @Priority (2) אירוע של דוגמא לאירוע) {// ... יישום}

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

כְּמוֹ כֵן, אם אנו משתמשים באותה רמת עדיפות בשתי שיטות או יותר, הסדר שוב אינו מוגדר.

8. אירועים אסינכרוניים

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

אנו יכולים לפטר אירוע בצורה אסינכרונית עם ה- fireAsync () שיטה:

מחלקה ציבורית ExampleEventSource {@Inject אירוע exampleEvent; public void fireEvent () {exampleEvent.fireAsync (ExampleEvent חדש ("ברוך הבא לבלדונג!")); }}

שעועית מפעילה אירועים שהם יישומים של מִקרֶה מִמְשָׁק. לכן אנו יכולים להזריק אותם כמו כל שעועית קונבנציונאלית אחרת.

כדי להתמודד עם האירוע האסינכרוני שלנו, עלינו להגדיר שיטה אחת או יותר של צופה אסינכרוני באמצעות ה- @ObservesAsync ביאור:

מחלקה ציבורית AsynchronousExampleEventObserver {public void onEvent (@ObservesAsync ExampleEvent event) {// ... יישום}}

9. מסקנה

במאמר זה, למדנו כיצד להתחיל להשתמש במודל המשופר להודעות אירועים הכלול ב- CDI 2.0.

כרגיל, כל דגימות הקוד המוצגות במדריך זה זמינות ב- GitHub.


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