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

1. כוחות נהיגה

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

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

2. ה @Configurable ביאור

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

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

לפני כיסוי @Configurable ביאור, בואו נגדיר הגדרת שעועית אביבית:

@Service מחלקה ציבורית IdService {ספירת מידע פרטית סטטית; int createId () {count ++ count; }}

שיעור זה מעוטר עם @שֵׁרוּת ביאור; לפיכך ניתן לרשום אותו בהקשר האביב באמצעות סריקת רכיבים.

הנה מחלקת תצורה פשוטה המאפשרת מנגנון זה:

@ComponentScan מחלקה ציבורית AspectJConfig {}

2.2. באמצעות @Configurable

בצורתו הפשוטה ביותר, אנחנו יכולים להשתמש @Configurable ללא שום אלמנט:

@Configurable ציבורי אישי PersonObject {מזהה פרטי פרטי; שם מחרוזת פרטי; PersonObject ציבורי (שם מחרוזת) {this.name = שם; } // getters וקוד אחר שמוצג בסעיף המשנה הבא}

ה @Configurable ביאור, במקרה זה, מסמן את PersonObject בכיתה כשירות לתצורה מונעת אביב.

2.3. הזרקת שעועית אביב לאובייקט לא מנוהל

אנחנו יכולים להזריק IdService לְתוֹך PersonObject, בדיוק כמו שהיינו עושים בכל שעועית אביבית:

@Configurable ציבורי PersonObject הניתנים להגדרה {@ IdService פרטית אוטומטית פרטית; // שדות, קונסטרוקטור וגטרס - מוצג בסעיף המשנה הקודם void generateId () {this.id = idService.generateId (); }}

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

3. הפעלת אריגת AspectJ

3.1. הצהרת תוסף

כדי לאפשר אריגת AspectJ, ראשית אנו זקוקים לתוסף AspectJ Maven:

 org.codehaus.mojo aspectj-maven-plugin 1.11 

וזה דורש תצורה נוספת:

 1.8 התעלם מהיבטי האביב של org.springframework 

האלמנט הנדרש הראשון הוא תאימות רמת. ערך של 1.8 מגדיר את גרסאות ה- JDK המקור והן היעד ל- 1.8. אם לא נקבע במפורש, גרסת המקור תהיה 1.3 והיעד יהיה 1.1. ערכים אלה הם כמובן מיושנים ולא מספיקים ליישום ג'אווה מודרני.

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

שים לב שחפץ שהוזכר כזה חייב להתקיים כתלות בפרויקט:

 org.springframework-aspect-spring 5.2.7.RELEASE 

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

3.2. ביצוע תוסף

כדי להורות לתוסף לארוג את כל השיעורים הרלוונטיים, אנו זקוקים לכך הוצאות להורג תְצוּרָה:

   לְלַקֵט 

הודעה התוסף לְלַקֵט המטרה נקשרת לשלב מחזור החיים כברירת מחדל.

3.2. תצורת שעועית

השלב האחרון לאפשר שזירת AspectJ הוא לְהוֹסִיף @EnableSpringConfigured למחלקת התצורה:

@ComponentScan @EnableSpringConfigured class public AspectJConfig {}

ההערה הנוספת מוגדרת AnnotationBeanConfigurerAspect, אשר בתורו נרשם PersonObject מקרים עם מיכל IoC של Spring.

4. בדיקות

עכשיו, בואו נוודא שה- IdService שעועית הוזרקה בהצלחה לא PersonObject:

@RunWith (SpringRunner.class) @ContextConfiguration (classes = AspectJConfig.class) מחלקה ציבורית PersonUnitTest {@Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet () {PersonObject personObject = PersonObject; personObject.generateId (); assertEquals (1, personObject.getId ()); assertEquals ("Baeldung", personObject.getName ()); }}

5. הזרקת שעועית לישות JPA

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

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

5.1. מחלקת ישויות

נתחיל משלד כיתת הישות:

@Entity @Configurable (preConstruction = true) PersonEntity בכיתה ציבורית {@ Id מזהה פרטי; שם מחרוזת פרטי; Public PersonEntity () {} // קוד אחר - מוצג בסעיף המשנה הבא}

שימו לב ל קדם בניה אלמנט ב @Configurable ביאור: זה מאפשר לנו להזרים תלות באובייקט לפני שהוא בנוי במלואו.

5.2. הזרקת שירות

עכשיו אנחנו יכולים להזריק IdService לְתוֹך PersonEntity, דומה למה שעשינו איתו PersonObject:

// הערות PersonEntity בכיתה ציבורית {@Autowired @Transient פרטי IdService idService; // שדות ובונה ללא ארגון PersonEntity public (שם מחרוזת) {id = idService.generateId (); this.name = שם; } // גטרס}

ה @חולף ביאור משמש כדי לומר ל- JPA זאת idService הוא שדה שאסור להתמיד בו.

5.3. עדכון שיטת הבדיקה

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

@Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet () {// הצהרות קיימות PersonEntity personEntity = PersonEntity חדש ("Baeldung"); assertEquals (2, personEntity.getId ()); assertEquals ("Baeldung", personEntity.getName ()); }

6. אזהרות

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

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

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

7. מסקנה

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

את קוד ההטמעה ניתן למצוא ב- GitHub.