הערת @ Lookup באביב

1. הקדמה

במדריך מהיר זה, נסתכל על תמיכת הזרקת התלות של Spring ברמת השיטה באמצעות @הבט מעלה ביאור.

2. מדוע @הבט מעלה?

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

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

@הבט מעלה שימושי ל:

  • הזרקת שעועית ממוקמת באב-טיפוס לפולי יחיד (בדומה ל ספק)
  • הזרקת תלות באופן פרוצדורלי

שימו לב גם לכך @הבט מעלה הוא המקבילה של Java של אלמנט ה- XML שיטת בדיקת מידע.

3. שימוש @הבט מעלה

3.1. הזרקת שעועית ממוקמת באב-טיפוס לפולי סינגלטון

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

עַכשָׁיו, ספק היא בהחלט דרך אחת @הבט מעלה הוא תכליתי יותר במובנים מסוימים.

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

@Component @Scope ("אב טיפוס") מעמד ציבורי School School {// ... state-scoped state}

ואם ניצור שעועית יחיד שמשתמשת בה @הבט מעלה:

@Component בכיתה הציבורית StudentServices {// ... משתני חברים וכו '@ Lookup public SchoolNotification getNotification () {return null; } // ... גטרים וקובעים}

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

@ מבחן ציבורי בטל כאשרLookupMethodCalled_thenNewInstanceReturned () {// ... אתחל את ההקשר StudentServices תחילה = this.context.getBean (StudentServices.class); StudentServices שנייה = this.context.getBean (StudentServices.class); assertEquals (ראשון, שני); assertNotEquals (first.getNotification (), second.getNotification ()); }

שים לב שב- שירותי סטודנטעזבנו את getNotification שיטה כמו בדל.

הסיבה לכך היא שאביב עוקף את השיטה עם קריאה ל beanFactory.getBean (StudentNotification.class)כדי שנוכל להשאיר אותו ריק.

3.2. הזרקת תלות באופן פרוצדורלי

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

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

@Component @Scope ("אב טיפוס") הצהרת בית ספר בכיתה ציבורית {@ כיתה כיתה אוטומטית; שם מחרוזת פרטי; סימני אוסף פרטיים; Public SchoolNotification (שם מחרוזת) {// ... קבע שדות} // ... getters וקובעים ציבור מחרוזת addMark (סימן שלם) {this.marks.add (סימן); להחזיר this.grader.grade (this.marks); }}

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

לאחר מכן נוכל להוסיף שיטה ל שירותי סטודנט שלוקח את נתוני התלמידים ומתמיד:

מחלקה מופשטת ציבורית StudentServices {הערות מפה פרטיות = HashMap חדש (); מופשט מוגן @ Lookup SchoolNotification getNotification (שם מחרוזת); מחרוזת ציבורית appendMark (שם מחרוזת, סימן שלם) {SchoolNotification notice = notes.computeIfAbsent (שם, קיים -> getNotification (שם))); הודעת החזרה .addMark (סימן); }} 

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

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

היא עושה זאת על ידי יישום getSchoolNotification עם קריאה ל beanFactory.getBean (SchoolNotification.class, שם).

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

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

@ מבחן ציבורי בטל כאשרAbstractGetterMethodInjects_thenNewInstanceReturned () {// ... אתחל את הקשר StudentServices services = context.getBean (StudentServices.class); assertEquals ("PASS", services.appendMark ("אלכס", 89)); assertEquals ("FAIL", services.appendMark ("Bethany", 78)); assertEquals ("PASS", services.appendMark ("קלייר", 96)); }

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

4. מגבלות

למרות @הבט מעלההרבגוניות, יש כמה מגבלות בולטות:

  • @הבט מעלה-שיטות שלא הוענקו, כמו getNotification, חייב להיות קונקרטי כאשר הכיתה שמסביב, כמו סטוּדֶנט, הוא סרוק רכיבים. הסיבה לכך היא שסריקת רכיבים מדלגת על שעועית מופשטת.
  • @הבט מעלה-שיטות ביאורים לא יעבדו כלל כאשר הכיתה שמסביב @אפונה-מנוהל.

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

5. מסקנה

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

כל הקוד המשמש להדרכה זו נמצא ב- Github.


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