מבוא ל- AOP באביב

1. הקדמה

במדריך זה, נציג את AOP (Aspect Oriented Programming) עם Spring ונתחיל להבין כיצד נוכל להתחיל להשתמש בכלי רב עוצמה זה בתרחישים מעשיים.

אפשר גם למנף את ההערות של AspectJ בעת פיתוח באמצעות Spring AOP, אך במאמר זה אנו מתמקדים בתצורת הליבה מבוססת ה- XML ​​של Spring AOP.

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

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

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

מסגרת ה- AOP של אביב עוזרת לנו ליישם את החששות הרוחביים הללו.

3. תלות Maven

נתחיל בהוספת תלות ספריית AOP של אביב ב- pom.xml:

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

ניתן לבדוק כאן את הגרסה האחרונה של התלות.

4. מושגי AOP וטרמינולוגיה

בואו נעבור בקצרה על המושגים והמינוחים הספציפיים ל- AOP:

4.1. אובייקט עסקי

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

מחלקה ציבורית SampleAdder {public int add (int a, int b) {return a + b; }} 

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

4.2. אספקט

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

בואו נראה כיצד אנו מגדירים היבט פשוט:

מחלקה ציבורית AdderAfterReturnAspect {לוגר לוגר פרטי = LoggerFactory.getLogger (this.getClass ()); בטל ציבורי לאחר Return (Object returnValue) זורק Throwable {logger.info ("ערך החזר היה {}", returnValue); }} 

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

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

4.3. נקודת הצטרפות

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

באביב AOP, א הצטרף ל-Point תמיד מייצג ביצוע שיטה.

4.4. פוינטקאט

Pointcut הוא פרדיקט המסייע בהתאמה ל- עֵצָה להיות מיושם על ידי אספקט בפרט מסוים הצטרף ל-Point.

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

4.5. עֵצָה

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

באביב, an עֵצָה מעוצב כמיירט, המקיים שרשרת מיירטים סביב נקודת הצטרפות.

4.6. חיווט אובייקט והיבט עסקי

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

להלן קטע התצורה שהצבנו בתצורת אביב סטנדרטית ב “” תָג:

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

XML הוא, כמובן, לא האפשרות היחידה שלנו כאן; כאמור, גם הערות AspectJ נתמכות במלואן.

4.7. תצורה במבט

תָג aop: config משמש להגדרת תצורה הקשורה ל- AOP. בתוך ה config תג, אנו מגדירים את הכיתה המייצגת היבט. נתנו לו התייחסות ל "DoAfterReturningAspect" שעועית אספקט שיצרנו.

לאחר מכן, אנו מגדירים Pointcut באמצעות ה- קיצור דרך תָג. Pointcut המשמש בדוגמה לעיל הוא ביצוע (* org.baeldung.logger.SampleAdder +. * (..)) כלומר להחיל ייעוץ בכל שיטה בתוך SampleAdder מחלקה שמקבלת כל מספר ארגומנטים ומחזירה כל סוג ערך.

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

ייעוץ זה ב- Aspect לוקח פרמטר אחד מסוג לְהִתְנַגֵד. הפרמטר נותן לנו אפשרות לנקוט בפעולה לפני ו / או אחרי קריאת שיטת היעד. במקרה זה, אנו רק רושמים את ערך ההחזר של השיטה.

Spring AOP תומך בעצות מרובות באמצעות תצורה מבוססת ביאור - דוגמאות אלו ועוד ניתן למצוא כאן וכאן.

5. מסקנה

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

  • מבוא ל- AspectJ
  • יישום ביאור AOP מותאם אישית באביב
  • מבוא ל- Pointcut Expressions באביב
  • השוואת AOP האביב ו- AspectJ
  • מבוא לסוגי ייעוץ באביב

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


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