הזרקת תלות קונסטרוקטור באביב

1. הקדמה

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

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

כדי להתחיל אנחנו צריכים לייבא אביב-הקשר תלות שלנו pom.xml:

 org.springframework spring-context 5.2.8.RELEASE 

ואז עלינו להקים א תְצוּרָה קוֹבֶץ. קובץ זה יכול להיות POJO או אם אתה מעדיף, קובץ XML.

2. תצורה מבוססת ביאורים

קובץ התצורה של Java נראה בערך כמו אובייקט Java ישן רגיל עם כמה הערות נוספות:

@Configuration @ComponentScan ("com.baeldung.constructordi") מחלקה ציבורית Config {@Bean מנוע מנוע ציבורי () {להחזיר מנוע חדש ("v8", 5); שידור שידור ציבורי @ שעועית @ () {החזרת שידור חדש ("הזזה"); }} 

כאן אנו משתמשים בהערות כדי להודיע ​​על זמן הריצה של האביב כי מחלקה זו מספקת הגדרות שעועית (@אפונה ביאור) וכי יש לבצע בחבילה סריקת הקשר לשעועית נוספת com.baeldung.spring. לאחר מכן, אנו מגדירים א אוטו מעמד:

@ רכב ברמה ציבורית ברכב {@ רכב ציבורי אוטומטי (מנוע מנוע, תיבת הילוכים) {this.engine = מנוע; זה.העברה = שידור; }}

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

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

ApplicationContext context = חדש AnnotationConfigApplicationContext (Config.class); מכונית לרכב = context.getBean (Car.class);

3. הזרקת קונסטרוקטור מרומז

החל באביב 4.3, שיעורים עם קונסטרוקטור יחיד יכולים להשמיט את @Autowired ביאור. מעט נחמד של נוחות והסרת צלחת הדוד!

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

4. תצורה מבוססת XML

דרך נוספת להגדיר זמן ריצה של אביב באמצעות הזרקת תלות מבוססת קונסטרוקטור היא שימוש בקובץ תצורה של XML:

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

שֵׁם התכונה יכולה לשמש גם להתאמת משתנה של xml ל- java, אך אז את הקוד שלך צריך להיות מורכב עם דגל איתור באגים.

בהקשר של יישום האביב, במקרה זה, יש לאתחל באמצעות ClassPathXmlApplicationContext:

ApplicationContext context = חדש ClassPathXmlApplicationContext ("baeldung.xml"); מכונית לרכב = context.getBean (Car.class);

5. יתרונות וחסרונות

להזרקת קונסטרוקטור יש כמה יתרונות לעומת הזרקת שטח.

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

מחלקת ציבור UserService {@ UserRepository פרטית אוטומטית userRepository; }

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

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

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

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

6. מסקנה

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

ה יישום מלא של מדריך זה ניתן למצוא באתר GitHub.


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