מבוא לסוגי ייעוץ באביב

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

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

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

ואם אתה רוצה להעמיק בביטויים נקודתיים, עיין במבוא הקודם לאלה.

2. הפעלת ייעוץ

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

@Configuration @EnableAspectJAutoProxy מחלקה ציבורית AopConfiguration {...}

2.1. מגף אביב

בפרויקטים של Spring Boot, אנחנו לא צריכים להשתמש במפורש @EnableAspectJAutoProxy. יש ייעודי AopAutoConfiguration המאפשר תמיכה ב- AOP של אביב אם ה- אספקט אוֹ עֵצָה נמצא על מסלול הכיתה.

3. לפני הייעוץ

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

שקול את ההיבט הבא שרושם את שם השיטה לפני שהוא נקרא:

@Component @Aspect class class LoggingAspect {לוגר לוגר פרטי = Logger.getLogger (LoggingAspect.class.getName ()); @Pointcut ("@ target (org.springframework.stereotype.Repository)") RepositoryMethods () {}; @ לפני ("repositoryMethods ()") logMethodCall ריק (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("לפני" + methodName); }}

ה logMethodCall ייעוץ יבוצע לפני כל שיטת מאגר המוגדרת על ידי מאגר שיטות קיצור דרך.

4. לאחר ייעוץ

לאחר ייעוץ, הוכרז באמצעות @לאחר הערה, מבוצעת לאחר ביצוע שיטה תואמת, בין אם הושלך חריג ובין אם לאו.

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

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

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

@Component @Apect בכיתה ציבורית PublishingAspect {פרטי ApplicationEventPublisher eventPublisher; @Eutowired public void setEventPublisher (ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher; } @Pointcut ("@ target (org.springframework.stereotype.Repository)") repositoryMethods public () {} @Pointcut ("ביצוע (* * .. create * (Long, ..))") ") public public ריק LongLarParamMethods ( ) {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entityCreationMethods () {} @AfterReturning (value = "entityCreationMethods ()", return = "entity") public void logMethodCall (JoinPoint jp, Object Object) זורק Throwable {eventPublisher.publishEvent (FooCreationEvent חדש (ישות)); }}

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

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

מחלקה ציבורית @Component FooCreationEventListener מיישם את ApplicationListener {לוגר לוגר פרטי = Logger.getLogger (getClass (). GetName ()); @ ביטול חלל ציבורי ב- ApplicationEvent (אירוע FooCreationEvent) {logger.info ("נוצר מופע foo:" + event.getSource (). ToString ()); }}

5. סביב ייעוץ

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

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

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

@Aspect @Component מחלקה ציבורית PerformanceAspect {לוגר לוגר פרטי = Logger.getLogger (getClass (). GetName ()); @Pointcut ("בתוך (@ org.springframework.stereotype.Repository *)") repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") אובייקט ציבורי measureMethodExecutionTime (ProceedingJoinPoint pjp) זורק זורק {התחלה ארוכה = System.nanoTime (); החזרת אובייקט = pjp.proceed (); סוף ארוך = System.nanoTime (); Method StringName = pjp.getSignature (). GetName (); logger.info ("ביצוע" + methodName + "לקח" + TimeUnit.NANOSECONDS.toMillis (סוף התחלה) + "ms"); החזר החזר; }}

עצה זו מופעלת כאשר כל אחת מנקודות ההצטרפות תואמת ל- repositoryClassMethods נקודת הקיצור מבוצעת.

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

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

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

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

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


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