CodeGym /בלוג Java /Random-HE /אביב לעצלנים יסוד, מושגי יסוד ודוגמאות עם קוד. חלק 1
John Squirrels
רָמָה
San Francisco

אביב לעצלנים יסוד, מושגי יסוד ודוגמאות עם קוד. חלק 1

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

מהי מסגרת האביב?

ה-Spring Framework, או פשוט Spring, היא אחת המסגרות הפופולריות ביותר ליצירת יישומי אינטרנט ב-Java. מסגרת היא כמו ספריה (אולי אתם מכירים יותר את המונח הזה), אבל יש מה לשקול. באופן גס, כאשר אתה משתמש בספריה, אתה פשוט יוצר מופעים של המחלקות שהיא מכילה, קורא לשיטות שאתה צריך, וכך מקבלים את התוצאה שאתה צריך. במילים אחרות, זו גישה הכרחית יותר: בתוכנית שלך אתה מציין במפורש את הרגע הספציפי שבו אתה צריך ליצור איזה אובייקט, מתי לקרוא לאיזו שיטה ספציפית וכו'. עם מסגרות, הדברים קצת שונים. אתה פשוט כותב כמה מחלקות משלך וכותב בהן קצת היגיון, אבל אז המסגרת עצמה יוצרת מופעים של המחלקות שלך וקוראת לשיטות שלהן. השיעורים שלך בדרך כלל מיישמים ממשקים מסוימים מהמסגרת או יורשים חלק מהמחלקות שלה, ובכך מספקים לך פונקציונליות כלשהי שכבר נכתבה עבורך. אבל זה לא תמיד המצב. לדוגמה, Spring מנסה ככל האפשר להימנע מחיבור כה הדוק (כאשר השיעורים שלך תלויים ישירות במחלקות/ממשקים במסגרת). הוא משתמש בהערות כדי להשיג זאת. נחזור לזה מאוחר יותר. אבל חשוב להבין ש-Spring הוא רק אוסף של שיעורים וממשקים שזמינים עבורכם לשימוש :) אני גם רוצה לציין מיד ש-Spring יכול לשמש לא רק עבור יישומי אינטרנט, אלא גם עבור תוכניות הקונסולה הנפוצות ביותר המוכרים כל כך לכולנו. ואפילו נכתוב אחד מהם היום.

מִבְנֶה

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

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
איור 2.1. סקירה כללית של מסגרת האביב

כפי שאתה יכול לראות, אביב הוא מודולרי. זה מאפשר לנו לחבר רק את המודולים שאנחנו צריכים עבור האפליקציה שלנו ולא לחבר את אלה שכמובן לא נשתמש בהם. עד כמה שידוע לי, הגישה הזו היא שנתנה ל-Spring להתעלות על המתחרה דאז (EJB) ולהוביל. יישומים המשתמשים ב-EJB גררו הרבה תלות מאחוריהם, וכתוצאה מכך, הם התבררו כאיטיים ואיטיים. התמונה מראה שמסגרת האביב מורכבת ממספר מודולים:
  • גישה למידע
  • אינטרנט
  • הליבה
  • ועוד
היום נכיר כמה מושגים שנמצאים במודול הראשי: שעועית, הקשר ואחרים. כפי שאולי ניחשתם, מודול ה-Data Access מכיל כלים לעבודה עם נתונים (בעיקר מסדי נתונים), ומודול ה-Web מיועד לעבודה ברשת (כולל יצירת יישומי אינטרנט, עליהם יידונו בהמשך). בנוסף, ישנה תשתית מקיפה שתומכת באביב: פרויקטים רבים אחרים שאינם כלולים רשמית במסגרת עצמה, אך משולבים בצורה חלקה בפרויקט האביב שלכם (למשל, Spring Security, שגם בו אני מקווה לגעת, מיועדת אימות משתמש באתר אינטרנט).

מדוע ל-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 בדיוק אילו אובייקטים אנו צריכים:
  1. קבצי תצורה של XML
  2. תצורה מבוססת Java
  3. תצורה אוטומטית
היוצרים של אביב נותנים להם עדיפות בסדר הזה:
  • השיטה עם העדיפות העליונה, שיש להעדיף, היא תצורה אוטומטית
  • אם לא ניתן להשתמש בתצורה אוטומטית כדי להגדיר כהלכה את כל הפולים האפשריים, השתמש בתצורה מבוססת Java (הכוללת יצירת אובייקטים באמצעות קוד Java)
  • והשיטה בעלת העדיפות הנמוכה ביותר היא הדרך המיושנת - שימוש בקובצי תצורה של XML.
האביב גם מאפשר לנו לשלב את השיטות הללו. לדוגמה, תן ל-Spring להגדיר את כל מה שניתן להגדיר באופן אוטומטי, השתמש בתצורה מבוססת Java בכל מקום שבו אתה צריך פרמטרים מיוחדים, והשתמש ב-XML עבור כל תצורות מדור קודם. כל זה מתברר להיות גמיש למדי. ובכל זאת, אם ניתן להגדיר הכל באופן אוטומטי, בחר באפשרות זו. אני אשקול רק תצורה אוטומטית ותצורה מבוססת Java. תצורות XML משמשות כמעט בכל דוגמה של Spring באינטרנט. יתרה מכך, ברגע שאתה מבין איך עובדת תצורה מבוססת Java, לא אמורה להיות לך בעיה לקרוא קובץ XML שעושה את אותו הדבר. תצורה אוטומטית משמשת כאשר אנו צריכים לעבוד עם אובייקטים של מחלקות שכתבנו. אם יצירת אחד מהאובייקטים שלנו דורשת לוגיקה מאוד ספציפית, או אם איננו מסוגלים ליצור מחלקה כלשהי עם ההערה הנחוצה לתצורה אוטומטית, אז נוכל להשתמש בתצורה מבוססת Java כדי לעשות את מה שצריך לעשות. בחלק הבא , ניצור פרויקט של מייבן, נחבר כמה ממודולי האביב הראשיים, וניצור את השעועית הראשונה שלנו.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION