הבנת getBean () באביב

1. הקדמה

במדריך זה נעבור על גרסאות שונות של ה- BeanFactory.getBean () שיטה.

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

2. הגדרת שעועית אביב

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

@Configuration class AnnotationConfig {@Bean (name = {"tiger", "kitty"}) @Scope (value = "prototype") Tiger getTiger (שם מחרוזת) {להחזיר Tiger (name) חדש; } @Bean (name = "lion") אריה getLion () {להחזיר אריה חדש ("שם אריה מקודד"); } ממשק בעלי חיים {}} 

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

3. ה getBean () ממשקי API

BeanFactory מספק חמש חתימות שונות של getBean () שיטה שנבחן בסעיפי המשנה הבאים.

3.1. אחזור שעועית לפי שם

בואו נראה איך נוכל לאחזר א אַריֵה מופע שעועית המשתמש בשמו:

אובייקט אריה = context.getBean ("אריה"); assertEquals (Lion.class, lion.getClass ());

בגרסה זו אנו מספקים שם ובתמורה נקבל מופע של לְהִתְנַגֵד class אם שעועית עם השם הנתון קיימת בהקשר היישום. אחרת, גם זה וגם כל יישומים אחרים זורקים NoSuchBeanDefinitionException אם בדיקת השעועית נכשלת.

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

נניח ואנחנו מנסים להשיג א נָמֵר באמצעות השם "אַריֵה". כאשר אנו מטילים את התוצאה ל נָמֵר, זה יזרוק א ClassCastException:

assertThrows (ClassCastException.class, () -> {Tiger tiger = (Tiger) context.getBean ("lion");});

3.2. אחזור שעועית לפי שם וסוג

כאן עלינו לציין את השם ואת סוג השעועית המבוקשת:

אריה אריה = context.getBean ("אריה", Lion.class);

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

assertThrows (BeanNotOfRequiredTypeException.class, () -> context.getBean ("אריה", Tiger.class)); }

3.3. אחזור שעועית לפי סוג

עם הגרסה השלישית של getBean (), זה מספיק כדי לציין רק את סוג השעועית:

אריה אריה = context.getBean (Lion.class);

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

assertThrows (NoUniqueBeanDefinitionException.class, () -> context.getBean (Animal.class)); }

בדוגמה לעיל, כי שניהם אַריֵה ו נָמֵר ליישם את בעל חיים ממשק, רק ציון סוג אינו מספיק כדי לקבוע באופן חד משמעי את התוצאה. לכן, אנו מקבלים א NoUniqueBeanDefinitionException.

3.4. אחזור שעועית לפי שם עם פרמטרים של קונסטרוקטור

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

נמר נמר = (Tiger) context.getBean ("נמר", "סיבירי");

שיטה זו שונה מעט מכיוון שהיא חלה רק על שעועית עם היקף אב-טיפוס.

במקרה של יחידים, אנחנו הולכים לקבל BeanDefinitionStoreException.

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

נמר נמר = (Tiger) context.getBean ("נמר", "סיבירי"); הנמר secondTiger = (Tiger) context.getBean ("נמר", "פסים"); assertEquals ("סיבירי", tiger.getName ()); assertEquals ("פסים", secondTiger.getName ());

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

3.5. אחזור שעועית לפי סוג עם פרמטרים של קונסטרוקטור

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

נמר נמר = context.getBean (Tiger.class, "Shere Khan"); assertEquals ("Shere Khan", tiger.getName ());

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

4. שיקולי שימוש

למרות שהוגדר ב BeanFactory ממשק, ה- getBean () לרוב גישה לשיטה דרך ApplicationContext. בדרך כלל, אנחנו לא רוצים להשתמש ב- getBean () שיטה ישירות בתכנית שלנו.

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

5. מסקנה

במדריך מהיר זה עברנו את כל היישומים של ה- getBean () שיטה מה- BeanFactory ממשק ותיאר את היתרונות והחסרונות של כל אחד מהם.

כל דוגמאות הקוד המוצגות כאן זמינות ב- GitHub.


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