מבוא להיפוך שליטה והזרקת תלות באביב

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

במאמר זה נציג את המושגים IoC (היפוך שליטה) ו- DI (הזרקת תלות), ואז נבחן כיצד אלה מיושמים במסגרת האביב.

2. מהי היפוך שליטה?

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

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

היתרונות של ארכיטקטורה זו הם:

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

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

אנו נסתכל על DI בהמשך.

3. מהי הזרקת תלות?

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

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

כך תיצור תלות באובייקטים בתכנות מסורתי:

חנות ברמה ציבורית {פריט פריט פרטי; חנות ציבורית () {item = new ItemImpl1 (); }}

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

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

חנות ברמה ציבורית {פריט פריט פרטי; חנות ציבורית (פריט פריט) {this.item = פריט; }}

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

גם ה- IoC וגם ה- DI הם מושגים פשוטים, אך יש להם השלכות עמוקות על הדרך בה אנו מבנים את המערכות שלנו, ולכן כדאי מאוד להבין היטב.

4. מיכל ה- IoC האביב

מיכל IoC הוא מאפיין נפוץ של מסגרות המיישמות IoC.

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

מסגרת האביב מספקת מספר יישומים של ApplicationContext ממשק - ClassPathXmlApplicationContext ו FileSystemXmlApplicationContext ליישומים עצמאיים, ו- WebApplicationContext ליישומי אינטרנט.

על מנת להרכיב שעועית, המכולה משתמשת במטא נתונים של תצורה, אשר יכול להיות בצורה של תצורת XML או הערות.

הנה דרך אחת להפעיל ידנית מיכל:

ApplicationContext context = חדש ClassPathXmlApplicationContext ("applicationContext.xml");

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

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

5. הזרקת תלות מבוססת קונסטרוקטור

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

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

@Configuration מחלקה ציבורית AppConfig {@Bean פריט ציבורי item1 () {להחזיר ItemImpl1 חדש (); } @Bean חנות ציבורית () {החזר חנות חדשה (item1 ()); }}

ה @תְצוּרָה ביאור מציין שהמחלקה היא מקור להגדרות שעועית. כמו כן, אנו יכולים להוסיף אותו למספר שיעורי תצורה.

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

עבור שעועית עם ברירת המחדל קְלָף בּוֹדֵד היקף, האביב בודק תחילה אם מופע במטמון של השעועית כבר קיים ויוצר אחד חדש רק אם לא. אם אנו משתמשים ב- אב טיפוס היקף, המכולה מחזירה מופע שעועית חדש עבור כל קריאת שיטה.

דרך נוספת ליצור את תצורת השעועית היא באמצעות תצורת XML:

6. הזרקת תלות מבוססת מגדיר

עבור DI מבוסס סתר, המכולה תקרא לשיטות קביעה מהמחלקה שלנו, לאחר הפעלת קונסטרוקטור ללא טיעון או שיטת מפעל סטטית ללא טיעון כדי לייצר את השעועית. בואו ניצור תצורה זו באמצעות הערות:

@Bean חנות ציבורית () {חנות חנות = חנות חדשה (); store.setItem (item1 ()); חנות חזרה; }

אנו יכולים גם להשתמש ב- XML ​​עבור אותה תצורה של שעועית:

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

7. מבוסס שדה הזרקת תלות

במקרה של DI מבוסס שדה, אנו יכולים להזריק את התלות על ידי סימון שלהם עם @Autowired ביאור:

חנות מחלקה ציבורית {@ פריט פרטי פרטי מאושר; }

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

אנו יכולים להשיג זאת גם באמצעות תצורת XML.

גישה זו עשויה להיראות פשוטה ונקייה יותר אך אינה מומלצת לשימוש מכיוון שיש לה כמה חסרונות כגון:

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

מידע נוסף על @Autowired ביאור ניתן למצוא במאמר חיווט באביב.

8. תלות בחיווט אוטומטי

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

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

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

לדוגמא, בואו לחווט אוטומטית את פריט 1 שעועית שהוגדרה לעיל לפי סוג לתוך חנות אפונה:

@Bean (autowire = Autowire.BY_TYPE) מחלקה ציבורית חנות {פריט פריט פרטי; set setitem (פריט פריט) {this.item = פריט; }}

אנחנו יכולים גם להזריק שעועית באמצעות @Autowired ביאור לחיווט אוטומטי לפי סוג:

חנות בכיתה ציבורית {@ פריט פרטי פרטי מאושר; }

אם יש יותר משעועית אחת מאותו סוג, נוכל להשתמש ב- @מַגְדִיר ביאור להפניה לשעועית בשם:

חנות בכיתה ציבורית {@Autowired @Qualifier ("item1") פריט פרטי פרטי; }

עכשיו, בואו נשלף אוטומטית לשעועית לפי סוג באמצעות תצורת XML:

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

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

9. שעועית מאותחלת עצלנית

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

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

10. מסקנה

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

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

  • היפוך של מיכלי בקרה ותבנית הזרקת התלות.
  • היפוך שליטה

ותוכלו ללמוד עוד על יישומי האביב של IoC ו- DI בתיעוד הפניה למסגרת האביב.


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