יישום ביאור AOP מותאם אישית באביב

1. הקדמה

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

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

התוצאה תהיה הבנה טובה יותר של AOP והיכולת ליצור את ההערות המותאמות אישית שלנו באביב בעתיד.

2. מהי ביאור AOP?

לסיכום מהיר, AOP מייצג תכנות מונחה-היבט. בעיקרו של דבר, זוהי דרך להוסיף התנהגות לקוד קיים מבלי לשנות קוד זה.

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

סוג ה- AOP שניישם במאמר זה הוא מונע הערות. יתכן ואנחנו מכירים את זה כבר אם השתמשנו באביב @ Transactional ביאור:

@ Transactional void orderGoods (Order Order) {// סדרה של שיחות בסיס נתונים שיש לבצע בעסקה}

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

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

3. תלות של Maven

ראשית, בואו נוסיף את התלות שלנו ב- Maven.

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

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter-aop 

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

4. יצירת ההערה המותאמת אישית שלנו

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

@Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) ציבורי @ ממשק LogExecutionTime {} 

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

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

וגם @הַחזָקָה רק מציין אם ההערה תהיה זמינה ל- JVM בזמן הריצה או לא. כברירת מחדל זה לא, כך ש- Spring AOP לא יוכל לראות את ההערה. זו הסיבה שהוא הוגדר מחדש.

5. יצירת היבט שלנו

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

@Aspect @Component class class BeispillAspect {}

כללנו גם את @רְכִיב ביאור, מכיוון שהכיתה שלנו צריכה להיות גם שעועית אביב כדי שניתן יהיה לזהות אותה. בעיקרו של דבר, זהו המעמד בו אנו מיישמים את ההיגיון שאנו רוצים שההערה המותאמת אישית שלנו תזריק.

6. יצירת נקודת הקיצור והייעוץ שלנו

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

@Around ("@ annotation (LogExecutionTime)") יומן אובייקט ציבוריExecutionTime (ProceedingJoinPoint joinPoint) זורק זורק {return joinPoint.proceed (); }

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

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

הבא, שלנו @סְבִיב לביאור יש טיעון נקודתי. קיצור הדרך שלנו אומר רק, 'החל את העצה הזו בכל שיטה בה כתוב @ LogExecutionTime. ' יש המון סוגים אחרים של קיצורי דרך, אך הם שוב יישארו בחוץ אם היקף.

השיטה logExecutionTime () עצמה היא העצה שלנו. יש טיעון יחיד, ממשיך להצטרף ל-PointPoint. במקרה שלנו, זו תהיה שיטת ביצוע שעליה הועלה הערה @ LogExecutionTime.

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

7. רישום זמן הביצוע שלנו

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

@Around ("@ annotation (LogExecutionTime)") יומן אובייקט ציבוריExecutionTime (ProceedingJoinPoint joinPoint) זורק לזריקה {התחלה ארוכה = System.currentTimeMillis (); אובייקט המשך = joinPoint.proceed (); זמן ביצוע ארוך = System.currentTimeMillis () - התחל; System.out.println (joinPoint.getSignature () + "מבוצע ב-" + executionTime + "ms"); חזור המשך; }

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

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

@LogExecutionTime הרשת הציבור () זורק את InterruptedException {Thread.sleep (2000); }

לאחר הביצוע, עלינו לראות את הבאים מחוברים למסוף:

void org.baeldung.Service.serve () בוצע בשנת 2030ms

8. מסקנה

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

קוד המקור ליישום שלנו זמין באתר GitHub; זהו פרויקט Maven שאמור להיות מסוגל לפעול כפי שהוא.