מבוא לפגיון 2

1. הקדמה

במדריך זה נסתכל על פגיון 2 - מסגרת הזרקת תלות מהירה וקלה.

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

2. הזרקת תלות

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

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

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

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

לעומת זאת, זמן ה- Compile-time מבוסס על יצירת קוד. משמעות הדבר היא שכל פעולות המשקל הכבד מבוצעות במהלך ההידור. זמן ה- Compile בזמן מוסיף מורכבות אך בדרך כלל מבצע מהר יותר.

פגיון 2 נכנס לקטגוריה זו.

3. תצורת Maven / Gradle

על מנת להשתמש בדג'ר בפרויקט, נצטרך להוסיף את ה- פִּגיוֹן תלות שלנו pom.xml:

 com.google.dagger dolk 2.16 

יתר על כן, נצטרך לכלול את מהדר ה- Dagger המשמש להמרת המחלקות המוערות שלנו לקוד המשמש להזרקות:

 org.apache.maven.plugins maven-compiler-plugin 3.6.1 com.google.dagger dolk-compiler 2.16 

עם תצורה זו, Maven יפיק את הקוד שנוצר לתוך יעד / מקורות שנוצרו / הערות.

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

לחלופין, אם אנו משתמשים ב- Android עם Gradle, אנו יכולים לכלול את שתי התלות:

הידור 'com.google.dagger: פגיון: 2.16' הערה מעבד 'com.google.dagger: פגיון-מהדר: 2.16'

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

4. יישום

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

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

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

מכונית ברמה ציבורית {מנוע מנוע פרטי; מותג מותג פרטי; @ הזרקת רכב ציבורי (מנוע מנוע, מותג מותג) {this.engine = מנוע; this.brand = מותג; } // גטרים וקובעים}

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

  • א מודול, שהוא מחלקה המספקת או בונה את התלות של האובייקטים, ו-
  • א רְכִיב, שהוא ממשק המשמש לייצור המזרק

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

בואו נראה איך ליישם אותם.

4.1. מודול

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

@Module Class Class VehiclesModule {}

לאחר מכן, אנחנו צריכים להוסיף את @Provides ביאור על שיטות הבונות את התלות שלנו:

@Module public class VehiclesModule {@Provides מנוע ציבורי לספק מנוע () {להחזיר מנוע חדש (); } @Provides @Singleton public brand supplyBrand () {להחזיר מותג חדש ("Baeldung"); }}

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

4.2. רְכִיב

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

במילים פשוטות, אנו זקוקים לחתימת שיטה המחזירה a אוטו ו אנחנו צריכים לסמן את הכיתה עם @רְכִיב ביאור:

@Singleton @Component (modules = VehiclesModule.class) ממשק ציבורי VehiclesComponent {Car buildCar (); }

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

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

4.3. קוד לקוח

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

לאחר מכן, אנו מוצאים את יישום הרכיבים שלנו באותו שם כמו הממשק, רק קידומת "פִּגיוֹן“:

@Test public void givenGeneratedComponent_whenBuildingCar_thenDependenciesInjected () {VehiclesComponent component = DaggerVehiclesComponent.create (); Car carOne = component.buildCar (); Car carTwo = component.buildCar (); Assert.assertNotNull (carOne); Assert.assertNotNull (carTwo); Assert.assertNotNull (carOne.getEngine ()); Assert.assertNotNull (carTwo.getEngine ()); Assert.assertNotNull (carOne.getBrand ()); Assert.assertNotNull (carTwo.getBrand ()); Assert.assertNotEquals (carOne.getEngine (), carTwo.getEngine ()); Assert.assertEquals (carOne.getBrand (), carTwo.getBrand ()); }

5. אנלוגיות אביביות

מי שמכיר את אביב אולי הבחין במקבילות מסוימות בין שתי המסגרות.

פגיון @Module ביאור הופך את המיכל למודע לכיתה בצורה דומה מאוד לכל הערות הסטריאוטיפ של אביב (למשל, @שֵׁרוּת, @בקר...). כְּמוֹ כֵן, @Provides ו @רְכִיב כמעט שוות ערך לזה של אביב @אפונה ו @הבט מעלה בהתאמה.

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

6. מסקנה

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

כמו תמיד, כל הקוד במאמר זמין באתר GitHub.


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