מדריך להפעלת היגיון בהפעלה באביב

1. הקדמה

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

2. הפעלת לוגיקה בהפעלה

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

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

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

בואו נסתכל על הדוגמה האמיתית:

@ מחלקה ציבורית רכיב InvalidInitExampleBean {@ סביבה פרטית סביבה פרטית; public InvalidInitExampleBean () {env.getActiveProfiles (); }}

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

האביב נותן לנו כמה דרכים לנהל את המצב הזה.

2.1. ה @PostConstruct ביאור

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

הנה @PostConstruct בִּפְעוּלָה:

מחלקה ציבורית @Component PostConstructExampleBean {לוגר סופי סטטי פרטי LOG = Logger.getLogger (PostConstructExampleBean.class); @ סביבת סביבה פרטית אוטומטית; @PostConstruct פן ריק () {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

בדוגמה שלמעלה ניתן לראות כי ה- סביבה המקרה הוזרק בבטחה ואז נקרא @PostConstruct שיטת ביאור מבלי לזרוק א NullPointerException.

2.2. ה אתחול שעועית מִמְשָׁק

ה אתחול שעועית הגישה עובדת די דומה לקודמתה. במקום להוסיף הערה לשיטה, עליך ליישם את ה- אתחול שעועית ממשק ו- afterPropertiesSet () שיטה.

כאן תוכלו לראות את הדוגמה הקודמת המיושמת באמצעות ה- אתחול שעועית מִמְשָׁק:

מחלקה ציבורית @Component InitializingBeanExampleBean מיישמת InitializingBean {לוגרית סופית סטטית פרטית LOG = Logger.getLogger (InitializingBeanExampleBean.class); @ סביבת סביבה פרטית אוטומטית; @ ביטול ציבורי בטל afterPropertiesSet () זורק חריג {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

2.3. An יישום מאזין

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

על מנת להשיג זאת עליכם ליצור שעועית המיישמת את יישום מאזין מִמְשָׁק:

מחלקה ציבורית @Component StartupApplicationListenerExample מיישם ApplicationListener {פרטית סופית לוגר לוגר LOG = Logger.getLogger (StartupApplicationListenerExample.class); מונה ציבורי סטטי ציבורי; @ ביטול חלל ציבורי ב- ApplicationEvent (אירוע ContextRefreshedEvent) {LOG.info ("מונה תוספת"); מונה ++; }} 

את אותן התוצאות ניתן להשיג באמצעות החדש שהוצג @EventListener ביאור:

מחלקה ציבורית @Component EventListenerExampleBean {לוגרית סופית סטטית פרטית LOG = Logger.getLogger (EventListenerExampleBean.class); מונה ציבורי סטטי ציבורי; @EventListener חלל ציבורי ב- ApplicationEvent (אירוע ContextRefreshedEvent) {LOG.info ("מונה תוספת"); מונה ++; }}

בדוגמה זו בחרנו ב- ContextRefreshedEvent. דאגו לבחור אירוע מתאים המתאים לצרכים שלכם.

2.4. ה @אפונה תכונת Initmethod

ה initMethod ניתן להשתמש במאפיין לביצוע שיטה לאחר אתחול השעועית.

הנה איך נראית שעועית:

מחלקה ציבורית InitMethodExampleBean {לוגר לוגרית סטטית פרטית LOG = Logger.getLogger (InitMethodExampleBean.class); @ סביבת סביבה פרטית אוטומטית; init חלל ציבורי () {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

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

לאחר מכן, אנו יכולים להגדיר את השעועית באמצעות ה- @אפונה ביאור:

@Bean (initMethod = "init") InitMethodExample ציבורי InitMethodExampleBean () {להחזיר InitMethodExampleBean חדש (); }

וכך נראית הגדרת שעועית בתצורת XML:

2.5. הזרקת קונסטרוקטור

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

מחלקה ציבורית @Component LogicInConstructorExampleBean {לוגר סופי סטטי פרטי LOG = Logger.getLogger (LogicInConstructorExampleBean.class); סביבת סביבה פרטית הסופית; @Autowired ציבורי LogicInConstructorExampleBean (סביבת סביבה) {this.environment = סביבה; LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

2.6. מגף אביב CommandLineRunner

מגף קפיץ מספק CommandLineRunner ממשק עם התקשרות חוזרת לָרוּץ() שיטה אשר ניתן להפעיל בעת הפעלת היישום לאחר הקמת יישום האביב.

בואו נסתכל על דוגמה:

מחלקה ציבורית @Component CommandLineAppStartupRunner מיישמת את CommandLineRunner {לוגר לוגרית פרטית סטטית פרטית LOG = LoggerFactory.getLogger (CommandLineAppStartupRunner.class); מונה ציבורי סטטי ציבורי; ריצה בטלה ציבורית של @Override (מחרוזת ... טוענת) זורקת חריגה {LOG.info ("מונה תוספת"); מונה ++; }}

הערה: כאמור בתיעוד, מרובה CommandLineRunner ניתן להגדיר שעועית באותו הקשר יישומי וניתן להזמין אותם באמצעות הוזמן ממשק או @להזמין ביאור.

2.7. מגף אביב ApplicationRunner

דומה ל CommandLineRunner, מגף קפיץ מספק גם ApplicationRunner ממשק עם לָרוּץ() שיטה שיש להפעיל בעת הפעלת היישום. עם זאת, במקום גלם חוּט טיעונים שהועברו לשיטת ההתקשרות, יש לנו מופע של יישום ארגונים מעמד.

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

בואו נסתכל על דוגמה:

מחלקה ציבורית @Component AppStartupRunner מיישמת את ApplicationRunner {לוגר לוגרי סופי סטטי פרטי = LoggerFactory.getLogger (AppStartupRunner.class); מונה ציבורי סטטי ציבורי; ריצה בטלנית ציבורית של @Override (ApplicationArguments args) זורקת Exception {LOG.info ("היישום התחיל עם שמות אפשרויות: {}", args.getOptionNames ()); LOG.info ("דלפק תוספת"); מונה ++; }}

3. שילוב מנגנונים

על מנת להשיג שליטה מלאה בשעועית שלך, כדאי לשלב את המנגנונים הנ"ל יחד.

סדר הביצוע הוא כדלקמן:

  1. הקונסטרוקטור
  2. ה @PostConstruct שיטות ביאור
  3. אתחול האתחול afterPropertiesSet () שיטה
  4. שיטת האתחול שצוינה כ- שיטת init ב- XML

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

@Component @Scope (value = "prototype") מחלקה ציבורית AllStrategiesExampleBean מיישמת InitializingBean {לוגרית סופית סטטית פרטית LOG = Logger.getLogger (AllStrategiesExampleBean.class); AllStrategiesExampleBean () ציבורי {LOG.info ("קונסטרוקטור"); } @Override ציבור בטל לאחרPropertiesSet () זורק חריג {LOG.info ("InitializingBean"); } @ PostConstruct ציבורי ריק PostConstruct () {LOG.info ("PostConstruct"); } init בטל פומבי () {LOG.info ("שיטת init"); }}

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

[main] INFO o.b.startup.AllStrategiesExampleBean - קונסטרוקטור [main] INFO o.b.startup.AllStrategiesExampleBean - PostConstruct [main] INFO o.b.startup.AllStrategiesExampleBean - InitializingBean [main] INFO o.b.startup.AllStrean

4. מסקנה

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

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