
מהי מסגרת האביב?
ה-Spring Framework, או פשוט Spring, היא אחת המסגרות הפופולריות ביותר ליצירת יישומי אינטרנט ב-Java. מסגרת היא כמו ספריה (אולי אתם מכירים יותר את המונח הזה), אבל יש מה לשקול. באופן גס, כאשר אתה משתמש בספריה, אתה פשוט יוצר מופעים של המחלקות שהיא מכילה, קורא לשיטות שאתה צריך, וכך מקבלים את התוצאה שאתה צריך. במילים אחרות, זו גישה הכרחית יותר: בתוכנית שלך אתה מציין במפורש את הרגע הספציפי שבו אתה צריך ליצור איזה אובייקט, מתי לקרוא לאיזו שיטה ספציפית וכו'. עם מסגרות, הדברים קצת שונים. אתה פשוט כותב כמה מחלקות משלך וכותב בהן קצת היגיון, אבל אז המסגרת עצמה יוצרת מופעים של המחלקות שלך וקוראת לשיטות שלהן. השיעורים שלך בדרך כלל מיישמים ממשקים מסוימים מהמסגרת או יורשים חלק מהמחלקות שלה, ובכך מספקים לך פונקציונליות כלשהי שכבר נכתבה עבורך. אבל זה לא תמיד המצב. לדוגמה, Spring מנסה ככל האפשר להימנע מחיבור כה הדוק (כאשר השיעורים שלך תלויים ישירות במחלקות/ממשקים במסגרת). הוא משתמש בהערות כדי להשיג זאת. נחזור לזה מאוחר יותר. אבל חשוב להבין ש-Spring הוא רק אוסף של שיעורים וממשקים שזמינים עבורכם לשימוש :) אני גם רוצה לציין מיד ש-Spring יכול לשמש לא רק עבור יישומי אינטרנט, אלא גם עבור תוכניות הקונסולה הנפוצות ביותר המוכרים כל כך לכולנו. ואפילו נכתוב אחד מהם היום.מִבְנֶה
אבל אביב הוא לא רק מסגרת מסוימת אחת. במקום זאת, זהו שם נפוץ המשמש להתייחסות למספר מסגרות קטנות, שכל אחת מהן עושה את סוג העבודה שלה.
https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
איור 2.1. סקירה כללית של מסגרת האביב
- גישה למידע
- אינטרנט
- הליבה
- ועוד
מדוע ל-Java יש את ה-Spring Framework?
ובכן, חוץ מהעובדה שהוא אופנתי, חלק ורענן, אני יכול לומר כבר עכשיו שברגע שתשיג אפילו כמות קטנה של מיומנות ב-Spring, תבין איך יש כל מיני עבודות שכבר אין לך. לעשות, וכמה עבודה האביב לוקח על עצמו. אתה יכול לכתוב כמה תריסר שורות של הגדרות תצורה ולכתוב כמה שיעורים, ובסופו של דבר אתה מקבל פרויקט עובד. אבל ברגע שאתה מתחיל לתהות כמה דברים יש מתחת למכסה המנוע, כמה עבודה מתבצעת, וכמה קוד היית צריך לכתוב אם אתה מתכוון ליישם את אותו פרויקט מבוסס על סרבלטים או שקעים רגילים ו-Java טהור, השיער שלך יזדקף :) האביב אפילו מתואר כסוג של קסם. אתה חווה את זה כשאתה רואה שהכל עובד, אבל יש לך גם מושג גס איך וכמה עבודה מתרחשת מאחורי הקלעים - אז נראה שבאמת יש סוג של קסם בפעולה :) יותר קל לקרוא לזה קסם מאשר לנסות להסביר איך הכל קשור זה בזה. :) הטיעון השני בעד לימוד אביב הוא שכ-90% מהמשרות הפנויות למפתחים זוטרים (בהתבסס על התצפיות האישיות שלי) דורשים ידע או לפחות מושג כללי על מה מציעים ה-Spring, והמודוליםData
למפתחים Web MVC
מתוחכמים Security
:) אבל היום זה רק על היסודות.
DI/IoC
אם אי פעם ניסית לקרוא על אביב, אז הדבר הראשון שנתקלת בו היה כנראה ראשי התיבות האלה: DI/IoC. עכשיו אני ממליץ לך לקחת הפסקה מהמאמר הזה ולקרוא את המאמר הזה של DZone ! IoC מייצג היפוך שליטה. כבר הזכרתי זאת בפתאומיות כשכתבתי ששימוש בספריה כרוך בעצמך לציין בקוד שלך איזו שיטה להתקשר לאיזה אובייקט, אבל ששימוש ב-framework פירושו בדרך כלל שה-framework תקרא לקוד שלך בזמן הנכון. במילים אחרות, במקרה האחרון הזה, אתה כבר לא מנהל את תהליך ביצוע הקוד/תוכנית - המסגרת עושה זאת עבורך. העברתם את השליטה למסגרת (היפוך שליטה). DI קיצור של הזרקת תלות . עם הזרקת תלות, אתה לא יוצר אובייקטים של חתול בשיטה הראשית ואז מעביר אותם לשיטות שלך. במקום זאת, מסגרת האביב יוצרת אותם עבורך. אתה פשוט אומר משהו כמו "אני רוצה להביא פה חתול" והמסגרת מעבירה לך אחד בשיטה שלך. נראה את הקיצור הזה במאמרים עתידיים.שעועית והקשר
אחד ממושגי המפתח באביב הוא שעועית. למעשה, זה רק אובייקט של מעמד כלשהו. נניח שיש לנו תוכנית שדורשת 3 חפצים: חתול, כלב ותוכי. ויש לנו חבורה של שיעורים עם חבורה של שיטות. לפעמים צריך חתול לשיטה, לפעמים צריך כלב לשיטה אחרת ולפעמים לשיטות שלנו צריך גם חתול וגם תוכי (למשל שיטת האכלת החתול חה-חה). עבור שיטות אחרות, יש צורך בכל שלושת האובייקטים. כן, נוכל קודם ליצור את שלושת האובייקטים האלה בשיטה הראשית, ואז להעביר אותם למחלקות שלנו, ואז בתוך המחלקות האלה להעביר אותם לשיטות הרלוונטיות... וכך הלאה לאורך כל התוכנית. אבל אם גם נניח שאנחנו רוצים מדי פעם לשנות את רשימת פרמטרי הקלט לשיטות שלנו (למשל, נחליט לשכתב משהו או להוסיף פונקציונליות חדשה), אז נצטרך לבצע לא מעט שינויים בקוד. ועכשיו דמיינו שאין לנו 3, אלא 300 חפצים כאלה. חלופה אחת תהיה לאסוף את כל האובייקטים שלנו ברשימה אחת (List<Object>
), להעביר אותה לכל שיטה, ואז לקבל את האובייקט הדרוש תוך כדי השיטות. אבל בזמן שהתוכנית פועלת, מה אם אובייקט כלשהו יתווסף לרשימה זו, או גרוע מכך, מה אם אחד נמחק? יש לזה פוטנציאל לשבור כל שיטה שבה אנו משתמשים באינדקס כדי לקבל אובייקטים מהרשימה. כדי למנוע בעיה זו, אנו מחליטים לאחסן את האובייקטים שלנו לא ברשימה, אלא במפה, כאשר המפתח הוא שם האובייקט והערך הוא האובייקט עצמו. זה מאפשר לנו לאחזר את האובייקטים שאנחנו צריכים פשוט על ידי שימוש בשם שלהם, למשל get("תוכי"), ובתגובה אנחנו מקבלים את אובייקט התוכי. או שהמפתח יכול להיות המחלקה של האובייקט, והערך יכול להיות האובייקט עצמו. במקרה זה, במקום לציין את שם האובייקט, אלא יכול רק לפרט את המחלקה של האובייקט שאנו צריכים. זה גם נוח. או שנוכל אפילו לכתוב סוג של מעטפת למפה, כאשר שיטות מסוימות מקבלות אובייקטים לפי שמם, ושיטות אחרות מקבלות אובייקטים לפי המחלקה שלהן. מה שהגענו אליו כאן נקרא הקשר יישום במסגרת האביב. הקשר הוא אוסף של שעועית (חפצים). אנו ניגשים להקשר כדי לקבל את השעועית (האובייקט) שאנו צריכים לפי שמה, לפי סוגו או באמצעים אחרים. בנוסף, אנחנו יכולים לבקש מאביב עצמו ללכת לחפש בהקשר שלו את השעועית שאנחנו צריכים ולהעביר אותה לשיטה שלנו. לדוגמה, נניח שהייתה לנו שיטה כזו:
public void doSomething(Cat cat) {
...
}
כשאביב קרא לשיטה הזו, הוא לקח את חפץ החתול שלנו מהקשרו והעביר אותו לשיטה. אבל עכשיו החלטנו שבנוסף לחתול, השיטה שלנו צריכה גם תוכי. עם אביב, שום דבר לא יכול להיות קל יותר! אנחנו פשוט כותבים:
public void doSomething(Cat cat, Parrot parrot) {
...
}
עכשיו כשאביב קורא לשיטה שלנו, הוא מבין את הצורך להעביר חתול ותוכי, אז הוא הולך להקשר שלו, מקבל את שני החפצים האלה ומעביר אותם לשיטה שלנו. על ידי העברת מושכות השליטה ל-Spring, אנו מעבירים גם אחריות על יצירת חפצים והעברתם לשיטות שלנו, אשר אביב יקרא. זה מעלה את השאלה: איך אביב יודע אילו חפצים (שעועית) ליצור?
דרכים להגדיר אפליקציה
ישנן שלוש דרכים עיקריות להגדיר יישום , כלומר, דרכים לומר ל-Spring בדיוק אילו אובייקטים אנו צריכים:- קבצי תצורה של XML
- תצורה מבוססת Java
- תצורה אוטומטית
- השיטה עם העדיפות העליונה, שיש להעדיף, היא תצורה אוטומטית
- אם לא ניתן להשתמש בתצורה אוטומטית כדי להגדיר כהלכה את כל הפולים האפשריים, השתמש בתצורה מבוססת Java (הכוללת יצירת אובייקטים באמצעות קוד Java)
- והשיטה בעלת העדיפות הנמוכה ביותר היא הדרך המיושנת - שימוש בקובצי תצורה של XML.
GO TO FULL VERSION