Java מתקדם | spring+AOP

‫קורס ‪ Java‬מתקדם‬
‫‪Spring + AOP‬‬
‫קרן כליף‬
2 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
:‫ביחידה זו נלמד‬
Aspect Oriented Programming 
AspectJ ‫ באמצעות‬AOP ‫ מימוש‬
Spring ‫ באמצעות‬AOP ‫ מימוש‬
‫ ומוטיבציה‬spring -‫ מהו מנגנון ה‬
spring -‫ במנגנון ה‬bean ‫ מעגל החיים של‬
‫‪ Java‬מתקדם |‬
‫‪3 | ©Keren Kalif |spring+AOP‬‬
‫התקנת ‪ plugin‬של ‪AspectJ‬‬
‫‪ ‬כדי לדעת מהי גרסת האקליפס‪ :‬בתפריט ‪ Help‬לבחור ‪:About‬‬
‫אם יש רק שם גרסה ללא מספר‪ ,‬יש‬
‫ללחוץ על ‪Installation Details‬‬
4 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
AspectJ ‫ של‬plugin ‫התקנת‬
‫‪ Java‬מתקדם |‬
‫‪5 | ©Keren Kalif |spring+AOP‬‬
‫התקנת ‪ plugin‬של ‪AspectJ‬‬
‫‪ ‬מהקישור הבא יש להתקין את גרסאת הפלאגין עבור הגרסה המתאימה לאקליפס שמותקן‬
‫אצלכם‪http://eclipse.org/ajdt/downloads/ :‬‬
‫‪ Java‬מתקדם |‬
‫‪6 | ©Keren Kalif |spring+AOP‬‬
‫תוכנית פשוטה עם פקודות ‪trace‬‬
‫בעיה ‪Tangling :1‬‬
‫ישנה הצמדה בין הלוגיקה של התוכנית‬
‫לבין פקודות המעקב‬
‫בעיה ‪Scattering :2‬‬
‫פקודות המעקב מפוזרות בכל מקום בקוד‬
‫‪ Java‬מתקדם |‬
‫‪7 | ©Keren Kalif |spring+AOP‬‬
‫פתרון בעית ה‪ trace -‬באמצעות ‪AOP‬‬
‫מאיפה הגיעו הדפסות המעקב??‬
8 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
pointcut, before, after :aspect -‫הגדרת ה‬
9 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
around :aspect -‫הגדרת ה‬
‫‪ Java‬מתקדם |‬
‫‪10 | ©Keren Kalif |spring+AOP‬‬
‫‪AOP – Aspect Oriented Programming‬‬
‫‪ ‬בתכנות מכוון עצמים (‪ )OOP‬האובייקט צריך לדעת לבצע את הפעולות שקשורות אליו‪ :‬לכתוב‬
‫ללוגים‪ ,‬תקשורת עם ‪ ,DB‬אבטחה‪ ,‬טיפול בשגיאות וכד'‬
‫‪o‬‬
‫כלומר‪ ,‬מחלקות מרובות היו צריכות לעבוד מול תשתיות אלו‬
‫‪ ‬בתכנות מכוון אספקטים (‪ )AOP‬יש אפשרות לעבוד רוחבית מול מודולים שונים במערכת‬
‫‪o‬‬
‫למשל‪ :‬יהיה מודול מרכזי שידע לעשות זאת עבור על המערכת (פותר את בעיית ה‪)scattering -‬‬
‫‪ ‬היתרון ב‪ :AOP -‬הפרדה בין הרכיבים השונים של המערכת‬
‫‪o‬‬
‫כך ניתן למכור ללקוח תוכנה ללא מודול מסויים בקלות (פותר את בעיית ה‪)tangling -‬‬
‫שני מימושיים מובילים ל‪:AOP -‬‬
‫ ‪( aspect‬שאיתו עבדנו עד כה)‬‫‪( Spring AOP -‬נראה בהמשך)‬
11 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫ מושגים‬- AOP
‫ מודול רוחבי באפליקציה‬:Crosscutting Concern 
‫ מייצג מקום המריץ מתודה‬:Join Point 
‫ אחת בקוד‬Join Point ‫ ביטוי המזהה לפחות‬:Point Cut 
Join Point -‫ פעולה המתבצעת ב‬:Advice 
‫ שיבוצעו עליהם‬Advice -‫ וה‬Point Cut ‫ שזוהו ע"י‬Join Point ‫ מודול הכולל אוסף של‬:Aspect 
‫ אחד לפחות‬Aspect -‫ אובייקט המקושר ל‬:Target Object / Adviced Object 
‫‪ Java‬מתקדם |‬
‫‪12 | ©Keren Kalif |spring+AOP‬‬
‫דוגמת שימוש‪ :‬שילוב ‪ AOP‬לתרגול רקורסיות‬
‫‪X‬‬
‫‪ ‬כאשר סטודנט כותב רקורסיה שאינה עובדת‪ ,‬קשה לו לאתר באיזה מחלקי הרקורסיה ישנה‬
‫טעות‬
‫‪ ‬מאחר ורקורסיה פשוטה מורכבת מ‪ 3 -‬חלקים‪ ,‬נכתוב תשתית אשר מבצעת חלק מסויים‬
‫מהרקורסיה‪ ,‬והסטודנט יצטרך להשלים חלק אחר‬
‫‪ ‬באופן זה הסטודנט יוכל לתרגל ולבדוק את כל אחד מחלקי הרקורסיה באופן בלתי‪-‬תלוי בשאר‬
‫החלקים‬
13 | ©Keren Kalif |spring+AOP
X
| ‫ מתקדם‬Java
‫ ציור משולש‬:1 ‫דוגמה‬
‫‪ Java‬מתקדם |‬
‫‪14 | ©Keren Kalif |spring+AOP‬‬
‫דוגמה‪ :‬סטודנט כותב רק תנאי עצירה‬
‫‪X‬‬
‫‪ Java‬מתקדם |‬
‫‪15 | ©Keren Kalif |spring+AOP‬‬
‫דוגמה‪ :‬סטודנט כותב רק קריאה רקורסיבית‬
‫‪X‬‬
‫‪ Java‬מתקדם |‬
‫‪16 | ©Keren Kalif |spring+AOP‬‬
‫דוגמה‪ :‬סטודנט כותב רק קישור‬
‫‪X‬‬
17 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫ המופעל עבור חריגות שנזרקו‬aspect
18 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫ המופעל עבור חריגות שנזרקו‬aspect
‫‪ Java‬מתקדם |‬
‫‪19 | ©Keren Kalif |spring+AOP‬‬
‫מהו ‪?Spring‬‬
‫‪ ‬תשתית באמצעותה ניתן לממש את מנגנון ה‪AOP -‬‬
‫‪ ‬בנוסף‪:‬‬
‫‪o‬‬
‫מערכת אשר רכיביה אינם מכירים אחד את השני ובקלות ניתן להחליף רכיב באחר‬
‫•‬
‫•‬
‫•‬
‫‪ ‬שימוש נרחב בממשקים‬
‫‪ ‬העדפה לשימוש בקונפיגורציה‬
‫‪ ‬שימוש רב ב‪beans -‬‬
‫‪ ‬הקישור ממנו נוריד ‪ plugin‬לאקליפס עבור ה‪:Spring Tool Suite -‬‬
‫‪http://dist.springsource.com/release/TOOLS/update/e4.3/‬‬
‫‪ Java‬מתקדם |‬
‫‪20 | ©Keren Kalif |spring+AOP‬‬
‫תחילת העבודה‬
‫‪ ‬נייצר פרוייקט מסוג ‪Spring‬‬
‫‪ ‬נוסיף אליו את כל ה‪'JAR -‬ים שבזיפ המצורף‬
‫‪ Java‬מתקדם |‬
‫‪21 | ©Keren Kalif |spring+AOP‬‬
‫מימוש אספקטים ב‪spring -‬‬
‫להוסיף לפרוייקט את ה‪'jar -‬ים עבור ה‪AOP -‬‬
22 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫דוגמא‬
aspect -‫ניתן לראות שה‬
bean -‫פעל רק עבור ה‬
23 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫ בקונפיגורציה‬Pointcut -‫ וה‬Aspect -‫הגדרת ה‬
‫‪ Java‬מתקדם |‬
‫‪24 | ©Keren Kalif |spring+AOP‬‬
‫סינון מתודות ב‪ PointCut -‬באמצעות ‪Annotation‬‬
‫מתודות שמתאימות לביטוי וסומנו עם‬
‫ה‪annotation -‬‬
‫\‬
‫איזו מתודה להריץ‬
‫מתי להריץ את ה‪Aspect -‬‬
25 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫‪ Java‬מתקדם |‬
‫‪26 | ©Keren Kalif |spring+AOP‬‬
‫סינון מחלקות ב‪PointCut -‬‬
‫ניתן להתבסס עם ‪ annotation‬שמופיע גם על‬
‫הפרמטרים או הערך המוחזר‬
‫‪ Java‬מתקדם |‬
‫‪27 | ©Keren Kalif |spring+AOP‬‬
‫טיפול במתודות שזרקו חריגה‬
‫וכמובן הטיפול יכול להיות כל פעולה‬
‫יותר מורכבת‪ ,‬למשל שליחת אימייל‬
‫וכד'‬
28 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
‫‪ Java‬מתקדם |‬
‫‪29 | ©Keren Kalif |spring+AOP‬‬
‫מיפוי ביניים‬
‫יצירת אובייקטים‬
‫בקונפיגורציה‬
‫מימוש באמצעות‬
‫קונפיגורציה‬
‫‪AOP‬‬
‫מימוש באמצעות‬
‫קונפיגורציה או ‪annotation‬‬
‫‪Spring‬‬
‫מימוש באמצעות יצירת‬
‫מחלקת ‪aspect‬‬
‫‪AspectJ‬‬
‫‪ Java‬מתקדם |‬
‫‪30 | ©Keren Kalif |spring+AOP‬‬
‫‪ - Spring‬דוגמא בסיסית‬
‫‪‬‬
‫(‪)1‬‬
‫באה לענות על הצורך של בניית מערכת אשר רכיביה אינם‬
‫מכירים אחד את השני ובקלות ניתן להחליף רכיב באחר‬
31 | ©Keren Kalif |spring+AOP
)2(
| ‫ מתקדם‬Java
‫דוגמא בסיסית‬
‫‪ Java‬מתקדם |‬
‫‪32 | ©Keren Kalif |spring+AOP‬‬
‫דוגמא בסיסית‬
‫(‪)3‬‬
‫הגדרת סוגי המשתנים‬
‫בקונפיגורציה‬
‫האובייקטים נטענים ומאותחלים‬
‫באמצעות מנגנון ה‪reflection -‬‬
‫לידיעה‪ :‬ה‪ c’tor -‬של ‪ ClassPathXmlApplicationContext‬יכול לקבל מערך‬
‫של מחרוזות‪ ,‬המכיל שמות קבצים מרובים בהם מוגדרים ה‪ bean -‬השונים‬
‫‪ Java‬מתקדם |‬
‫‪33 | ©Keren Kalif |spring+AOP‬‬
‫הפעלת שיטות ‪ set‬דרך הקונפיגורציה‬
‫ערך ה‪ name -‬יהיה כשם התכונה‪ ,‬ויופעל ה‪set -‬‬
‫המתאים באמצעות מנגנון ה‪reflection -‬‬
‫‪ Java‬מתקדם |‬
‫‪34 | ©Keren Kalif |spring+AOP‬‬
‫העברת פרמטר מטיפוס בסיסי לקונסטרקטור בקונפיגורציה‬
‫‪ Java‬מתקדם |‬
‫‪35 | ©Keren Kalif |spring+AOP‬‬
‫העברת פרמטר מטיפוס אובייקט לקונסטרקטור בקונפיגורציה‬
‫המנגנון של ‪ Spring‬יודע ליצר את‬
‫האובייקטים לפי סדר התלויות שלהם‬
‫)‪(Dependency Injection‬‬
‫‪ Java‬מתקדם |‬
‫‪36 | ©Keren Kalif |spring+AOP‬‬
‫סיכום הרעיון מאחורי השימוש ב‪spring -‬‬
‫‪ ‬מאפשר לתוכנית להגדיר את הלוגיקה והזרימה‪ ,‬ללא התייחסות למימושים ספציפיים‬
‫‪ ‬הקוד מתבסס על שימושים בממשקים‬
‫‪ ‬המימושים נקבעים בקונפיגורציה ונטענים בזמן ריצה באמצעות מנגנון ה‪relection -‬‬
‫‪ Java‬מתקדם |‬
‫‪37 | ©Keren Kalif |spring+AOP‬‬
‫מנגנון החיים של ‪bean‬‬
‫‪ ‬מעגל החיים של ה‪ bean -‬כולל ‪ 3‬שלבים‪:‬‬
‫‪.1‬‬
‫איתחול )‪(Initialization‬‬
‫•‬
‫•‬
‫‪.2‬‬
‫שימוש )‪(Use‬‬
‫•‬
‫‪.3‬‬
‫יצירת המשתנים‪ ,‬אתחול‪ ,‬הקצאת משאבים‬
‫מתבצע בזמן יצירת ה‪ApplicationContext -‬‬
‫ביצוע פעולות‬
‫הריסה )‪(Destruction‬‬
‫•‬
‫•‬
‫שחרור משאבים‬
‫יתבצע עם סגירת ה‪context -‬‬
‫‪ Java‬מתקדם |‬
‫‪38 | ©Keren Kalif |spring+AOP‬‬
‫מימוש מנגנון החיים של ה‪bean -‬‬
‫‪ ‬ישנן ‪ 3‬דרכים לממש את השלבים במעגל החיים של ה‪:bean -‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫שימוש ב‪ annotation -‬בקוד‬
‫הגדרת שיטות לאתחול‪/‬הריסה בקובץ הקונפיגורציה‬
‫מימוש ממשקים‬
39 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
annotations ‫מימוש מעגל החיים באמצעות‬
‫‪ Java‬מתקדם |‬
‫‪40 | ©Keren Kalif |spring+AOP‬‬
‫מימוש מעגל החיים באמצעות ‪annotations‬‬
‫יש לסגור את ה‪ context -‬על מנת‬
‫שיפעיל את מנגנון השחרור‬
‫‪ Java‬מתקדם |‬
‫‪41 | ©Keren Kalif |spring+AOP‬‬
‫מימוש מעגל החיים באמצעות הגדרת שיטות בקונפיגורציה‬
‫‪ Java‬מתקדם |‬
‫‪42 | ©Keren Kalif |spring+AOP‬‬
‫מימוש מעגל החיים באמצעות מימוש ממשקים‬
43 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
Bean Scoping
:‫ הוא אחד מהבאים‬bean ‫ טווח ההכרה של‬
)‫ (ברירת מחדל‬Singleton
‫ – מופע חדש לכל הפניה‬Prototype
Session
Request
o
o
o
o
44 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
main -‫ ה‬:Bean Scoping
‫‪ Java‬מתקדם |‬
‫‪45 | ©Keren Kalif |spring+AOP‬‬
‫הורשת ‪'bean‬ים‬
‫לא ניתן לייצר אובייקט‬
‫הגדרת ‪ /‬דריסת השדות הנוספים‬
‫כן יווצר ‪ bean‬מהגדרה זו‬
‫(אין ‪)abstract‬‬
‫‪ Java‬מתקדם |‬
‫‪46 | ©Keren Kalif |spring+AOP‬‬
‫הגדרת ‪'bean‬ים מקוננת‬
‫במקום לבצע ‪ ref‬ל‪ bean -‬אחר‪,‬‬
‫מגדירים אותו פנימי ל‪ bean -‬הנוכחי‪.‬‬
‫‪ ‬ה‪ bean -‬הפנימי אנונימי‪ ,‬אין לו ‪/id‬שם‬
‫‪o‬‬
‫‪ ‬לא ניתן לגשת ל‪ bean -‬הפנימי באופן ישיר‬
47 | ©Keren Kalif |spring+AOP
| ‫ מתקדם‬Java
:‫ביחידה זו למדנו‬
Aspect Oriented Programming 
AspectJ ‫ באמצעות‬AOP ‫ מימוש‬
Spring ‫ באמצעות‬AOP ‫ מימוש‬
‫ ומוטיבציה‬spring -‫ מהו מנגנון ה‬
spring -‫ במנגנון ה‬bean ‫ מעגל החיים של‬