סיומת ניידת CDI ו- Flyway

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

במדריך זה נעבור על תכונה מעניינת של CDI (Context and Dependency Injection) הנקראת סיומת ניידת CDI.

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

הדרכה זו מניחה הבנה בסיסית של CDI. עיין במאמר זה לקבלת מבוא ל- CDI.

2. מהו סיומת ניידת CDI?

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

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

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

3. תלות Maven

נתחיל בהוספה של התלות הנדרשת ל- CDI API ב- pom.xml. זה מספיק ליישום סיומת ריקה.

 javax.enterprise cdi-api 2.0.SP1 

ולהפעלת היישום, אנו יכולים להשתמש בכל יישום CDI תואם. במאמר זה נשתמש ביישום Weld.

 org.jboss.weld.se weld-se-core 3.0.5 זמן ריצה סופי 

אתה יכול לבדוק אם גרסאות חדשות של ה- API וההטמעה פורסמו ב- Maven Central.

4. הפעלת מסלול תעופה בסביבה שאינה CDI

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

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

DataSource dataSource = // ... נתיב תעופה = מסלול תעופה חדש (); flyway.setDataSource (dataSource); flyway.migrate ();

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

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

5. אירועי אתחול מיכל CDI

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

  1. שריפות לפני גילוי אירוע לפני שמתחיל תהליך הסריקה
  2. מבצע את גילוי הסוג שבו הוא סורק שעועית ארכיון, ולכל סוג שהתגלה הוא יורה ProcessAnnotatedType מִקרֶה
  3. מפטר את AfterTypeDiscovery מִקרֶה
  4. מבצע את גילוי השעועית
  5. מפטר את AfterBeanDiscovery מִקרֶה
  6. מבצע אימות שעועית ומזהה שגיאות הגדרה
  7. מפטר את לאחר פריסה אימות מִקרֶה

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

בסיומת ניידת CDI נוכל לצפות רק באירועים אלה.

6. כתיבת התוסף הנייד CDI

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

6.1. יישום ספק ה- SPI

סיומת ניידת CDI היא ספקית Java SPI של הממשק javax.enterprise.inject.spi.Extension. עיין במאמר זה לקבלת מבוא ל- Java SPI.

ראשית, אנו מתחילים לספק את סיומת יישום. בהמשך, נוסיף שיטות צופה לאירועי bootstrap של מיכל CDI:

מחלקה ציבורית FlywayExtension מיישמת את הרחבה {}

לאחר מכן, אנו מוסיפים שם קובץ META-INF / services / javax.enterprise.inject.spi.Extension עם התוכן הזה:

com.baeldung.cdi.extension.FlywayExtension

כ- SPI, זה סיומת נטען לפני רצועת האתחול של המכולה. כך שניתן לרשום שיטות צופה באירועי ה- bootstrap של CDI.

6.2. הגדרת שיטות תצפיתניות של אירועי אתחול

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

public void registerFlywayType (@Observes BeforeBeanDiscovery bbdEvent) {bbdEvent.addAnnotatedType (Flyway.class, Flyway.class.getName ()); }

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

לאחר מכן, נצפה ב ProcessAnnotatedType אירוע כדי להפוך את דרך טיסה בכיתה כשעועית מנוהלת CDI:

public void processAnnotatedType (@Observes ProcessAnnotatedType patEvent) {patEvent.configureAnnotatedType () .add (ApplicationScoped.Literal.INSTANCE) .add (new AnnotationLiteral () {}) .filterMethods (annotatedMethod -> {return annotatedMethod. Method. ) == 1 && annotatedMethod.getParameters (). Get (0) .getBaseType () .equals (javax.sql.DataSource.class);}). FindFirst (). Get (). Add (InjectLiteral.INSTANCE); }

ראשית, אנו מציינים את דרך טיסה כיתה עם @ApplicationScoped ו @ FlywayType ביאורים ואז נחפש ב- Flyway.setDataSource (DataSource dataSource) השיטה ואנו מציינים אותה על ידי @לְהַזרִיק.

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

@ApplicationScoped @ FlywayType Class public Flyway {// ... @ Inject public void setDataSource (DataSource dataSource) {// ...}}

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

לשם כך נעבוד לרישום a מקור מידע שעועית למיכל ונשתמש ב AfterBeanDiscovery מִקרֶה:

בטל afterBeanDiscovery (@Observes AfterBeanDiscovery abdEvent, BeanManager bm) {abdEvent.addBean () .types (javax.sql.DataSource.class, DataSource.class) .qualifiers (AnnotationLiteral new () {}, AnnotationLiteral חדש ()). היקף (ApplicationScoped.class) .name (DataSource.class.getName ()) .beanClass (DataSource.class) .createWith (creationContext -> {מופע DataSource = DataSource חדש (); מופע. setUrl (dataSourceDefinition.url ()); instance.setDriverClassName (dataSourceDefinition.className ()); מופע החזרה;}); }

כפי שאנו רואים, אנו זקוקים ל הגדרת נתונים המספק את מאפייני DataSource.

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

@ DataSourceDefinition (name = "ds", className = "org.h2.Driver", url = "jdbc: h2: mem: testdb")

כדי לחלץ מאפיינים אלה, אנו צופים ב ProcessAnnotatedType אירוע יחד עם @WithAnnotations ביאור:

גילוי חלל ציבורי DataDataSourceDefinition (@Observes @WithAnnotations (DataSourceDefinition.class) ProcessAnnotatedType patEvent) {AnnotatedType at = patEvent.getAnnotatedType (); dataSourceDefinition = at.getAnnotation (DataSourceDefinition.class); }

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

בטל runFlywayMigration (@Observes AfterDeploymentValidation adv, מנהל BeanManager) {Flyway flyway = manager.createInstance (). בחר (Flyway.class, AnnotationLiteral חדש () {}). get (); flyway.migrate (); }

7. מסקנה

בניית סיומת ניידת CDI נראית קשה בפעם הראשונה, אך ברגע שאנו מבינים את מחזור חיי אתחול המיכל ואת ה- SPI המוקדש לתוספות, הוא הופך לכלי חזק מאוד בו נוכל להשתמש כדי לבנות מסגרות על גבי ג'קרטה EE.

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


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