מדריך לאביב @ Autowired

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

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

במדריך זה, נבחן תחילה כיצד לאפשר חיווט אוטומטי ו-שׁוֹנִיםדרכים לרכב שעועית אוטומטית. אחר כך נדבר על פתרון סכסוכי שעועית באמצעות @מַגְדִיר ביאור, כמו גם תרחישים חריגים פוטנציאליים.

2. מאפשר @Autowired ביאורים

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

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

@Configuration @ComponentScan ("com.baeldung.autowire.sample") AppConfig בכיתה ציבורית {}

לחלופין, ה- ההערה משמשת בעיקר להפעלת הערות הזרקת התלות בקבצי XML באביב.

יתר על כך, מגף האביב מציג את @ SpringBootApplication ביאור. ביאור יחיד זה שקול לשימוש @תְצוּרָה, @EnableAutoConfiguration, ו @ComponentScan.

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

@SpringBootApplication class VehicleFactoryApplication {public static void main (String [] args) {SpringApplication.run (VehicleFactoryApplication.class, args); }}

כתוצאה מכך, כאשר אנו מריצים את היישום Spring Boot הזה, הוא יסרוק אוטומטית את הרכיבים בחבילה הנוכחית וחבילות המשנה שלה. כך הוא ירשום אותם בהקשר היישומי של אביב ויאפשר לנו להזריק שעועית באמצעות @Autowired.

3. שימוש @Autowired

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

3.1. @Autowired על נכסים

בואו נראה כיצד נוכל להוסיף הערות על נכס באמצעות @Autowired. זה מבטל את הצורך בפטרים וקובעים.

ראשית, נגדיר א fooFormatter אפונה:

@Component ("fooFormatter") מחלקה ציבורית FooFormatter {פורמט מחרוזת ציבורי () {להחזיר "foo"; }}

ואז, נזריק את השעועית הזו ל FooService שעועית באמצעות @Autowired על הגדרת השדה:

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

כתוצאה מכך, אביב מזריק fooFormatter מתי FooService נוצר.

3.2. @Autowired על סטרים

עכשיו בואו ננסה להוסיף @Autowired ביאור על שיטת קובע.

בדוגמה הבאה, שיטת הקובע נקראת עם המופע של FooFormatter מתי FooService נוצר:

מעמד ציבורי FooService {פרטי FooFormatter fooFormatter; @Autowired חלל ציבורי setFooFormatter (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }} 

3.3. @Autowired על קונסטרוקטורים

לבסוף, בואו נשתמש @Autowired על קונסטרוקטור.

נראה זאת מופע של FooFormatter מוזרק על ידי אביב כטיעון ל FooService בַּנַאִי:

מעמד ציבורי FooService {פרטי FooFormatter fooFormatter; @ FooService ציבורי אוטומטי (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }}

4. @Autowired ותלות אופציונלית

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

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

נגרמת על ידי: org.springframework.beans.factory.NoSuchBeanDefinitionException: לא נמצא שעועית מזכה מסוג [com.autowire.sample.FooDAO] לתלות: צפויה לפחות שעועית אחת שמתאימה למועמדת חוט אוטומטי לתלות זו. הערות תלות: {@ org.springframework.beans.factory.annotation.Autowired (חובה = נכון)}

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

FooService בכיתה ציבורית {@Autowired (חובה = שקר) FooDAO dataAccessor פרטי; }

5. פירוק חוט אוטומטי

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

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

5.1. חיווט אוטומטי על ידי @מַגְדִיר

לדוגמה, בואו נראה כיצד נוכל להשתמש ב- @מַגְדִיר ביאור לציון השעועית הנדרשת.

ראשית נגדיר 2 שעועית מהסוג מעצב:

@Component ("fooFormatter") מחלקה ציבורית FooFormatter מיישמת את Formatter {פורמט מחרוזת ציבורי () {להחזיר "foo"; }}
@Component ("barFormatter") מחלקה ציבורית BarFormatter מיישם Formatter {פורמט מחרוזת ציבורי () {סרגל "return"; }}

עכשיו בואו ננסה להזריק a מעצב שעועית לתוך FooService מעמד:

FooService בכיתה ציבורית {@ מעצב מעצב פרטי פרטי; }

בדוגמה שלנו, ישנם שני יישומים קונקרטיים של מעצב זמין עבור מיכל האביב. כתוצאה, האביב יזרוק א NoUniqueBeanDefinitionException יוצא מן הכלל בעת בניית ה- FooService:

נגרם על ידי: org.springframework.beans.factory.NoUniqueBeanDefinitionException: אין שעועית מזכה מסוג [com.autowire.sample.Formatter] מוגדרת: שעועית תואמת יחידה צפויה אך נמצאה 2: barFormatter, fooFormatter 

אנו יכולים להימנע מכך על ידי צמצום היישום באמצעות א @מַגְדִיר ביאור:

מעצב פרטי FooService {@Autowired @Qualifier ("fooFormatter") פרטי; }

כשיש שעועית מרובה מאותו סוג, מומלץ לעשות זאת להשתמש @מַגְדִיר כדי למנוע עמימות.

שים לב שערך ה- @מַגְדִיר ההערה תואמת את השם המוצהר ב- @רְכִיב ביאור שלנו FooFormatter יישום.

5.2. חיווט אוטומטי על ידי מוסמך מותאם אישית

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

@Qualifier @Target ({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention (RetentionPolicy.RUNTIME) public @interface FormatterType {ערך מחרוזת (); }

אז נוכל להשתמש ב- FormatterType בתוך יישומים שונים כדי לציין ערך מותאם אישית:

@FormatterType ("Foo") @Component public class FooFormatter מיישם את Formatter {פורמט מחרוזות ציבורי () {להחזיר "foo"; }}
@FormatterType ("Bar") @Component public class BarFormatter מיישם Formatter {פורמט מחרוזת ציבורי () {סרגל "return"; }}

לבסוף, ההערה המותאמת אישית שלנו היא מוכנה לשימוש לחיווט אוטומטי:

@FooService בכיתה הציבורית של רכיב {@Autowired @FormatterType ("Foo") מעצב פרטי; } 

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

5.3. חיווט אוטומטי לפי שם

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

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

FooService בכיתה ציבורית {@ פורמט מעצב פרטי fooFormatter; }

6. מסקנה

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

קוד המקור של מאמר זה זמין בפרויקט GitHub.