מבוא למתחילי אתחול האביב

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

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

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

יש לנו יותר מ -30 מנות התחלה זמינות - בואו נראה כמה מהן בסעיפים הבאים.

2. מפעיל האינטרנט

ראשית, בואו נסתכל על פיתוח שירות ה- REST; אנו יכולים להשתמש בספריות כמו Spring MVC, Tomcat ו- Jackson - הרבה תלות עבור יישום יחיד.

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

 org.springframework.boot spring-boot-starter-web 

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

@RestController מחלקה ציבורית GenericEntityController {EntityList רשימה פרטית = ArrayList חדש (); @RequestMapping ("/ entity / all") רשימה ציבורית findAll () {return entityList; } @ RequestMapping (value = "/ entity", method = RequestMethod.POST) ציבורי GenericEntity addEntity (GenericEntity ישות) {entityList.add (ישות); ישות החזרה; } @ RequestMapping ("/ entity / findby / {id}") ציבורי GenericEntity findById (@PathVariable Long ID) {return entityList.stream (). פילטר (ישות -> entity.getId (). שווה (id)). findFirst (). get (); }}

ה GenericEntity הוא שעועית פשוטה עם תְעוּדַת זֶהוּת מהסוג ארוך ו ערך מהסוג חוּט.

זהו זה - כשהאפליקציה פועלת, תוכלו לגשת // localhost: 8080 / entity / all ולבדוק שהבקר עובד.

יצרנו יישום REST עם תצורה מינימלית למדי.

3. מתחיל המבחן

לצורך בדיקה אנו משתמשים בדרך כלל במערך הספריות הבא: Spring Test, JUnit, Hamcrest ו- Mockito. אנו יכולים לכלול את כל הספריות הללו באופן ידני, אך ניתן להשתמש במתנע האביב של Spring Boot כדי לכלול באופן אוטומטי את הספריות באופן הבא:

 מבחן מבחן org.springframework.boot-boot-starter-test 

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

בואו ונבדוק את הבקר שיצרנו בדוגמה הקודמת.

ישנן שתי דרכים לבדוק את הבקר:

  • שימוש בסביבה מדומה
  • שימוש במיכל Servlet המוטמע (כמו Tomcat או Jetty)

בדוגמה זו נשתמש בסביבה מדומה:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) @WebAppConfiguration class public SpringBootApplicationIntegrationTest {@Autowired פרטי WebApplicationContext webApplicationContext; פרטי MockMvc mockMvc; @ לפני הריק הציבורי setupMockMvc () {mockMvc = MockMvcBuilders.webAppContextSetup (webApplicationContext) .build (); } @Test ציבור בטל givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect () זורק חריג {MediaType contentType = MediaType חדש (MediaType.APPLICATION_JSON.getType (), MediaType.APPLICATION_JSON.getSubtype (),) mockMvc.perform (MockMvcRequestBuilders.get ("/ ישות / הכל")). ו- Expect (MockMvcResultMatchers.status (). isOk ()). ו- Expect (MockMvcResultMatchers.content (). contentType (contentType)). ו- Expect (jsonPath ("$", hasSize (4))); }}

המבחן הנ"ל מכנה את / ישות / הכל נקודת קצה ומאמת כי תגובת JSON מכילה 4 אלמנטים. כדי שמבחן זה יעבור, עלינו לאתחל את הרשימה שלנו בכיתת הבקר:

מחלקה ציבורית GenericEntityController {EntityList של רשימה פרטית = ArrayList חדש (); {entityList.add (GenericEntity חדש (1 ליטר, "entity_1")); entityList.add (GenericEntity חדש (2l, "entity_2")); entityList.add (GenericEntity חדש (3l, "entity_3")); entityList.add (GenericEntity חדש (4l, "entity_4")); } // ...}

מה שחשוב כאן זה @WebAppConfiguration ביאור ו MockMVC הם חלק מה- אביב-מבחן מודול, יש גודל הוא שדכן של המקרסט, ו @לפני הוא ביאור של JUnit. כל אלה זמינים על ידי ייבוא ​​של תלות ראשונה זו.

4. Starter Data JPA

לרוב יישומי האינטרנט יש איזושהי התמדה - וזה לעתים קרובות למדי JPA.

במקום להגדיר את כל התלות הקשורות באופן ידני - בוא נלך עם המתנע במקום:

 org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime 

שימו לב כי מחוץ לקופסה יש לנו תמיכה אוטומטית לפחות במסדי הנתונים הבאים: H2, Derby ו- Hsqldb. בדוגמה שלנו נשתמש ב- H2.

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

ממשק ציבורי GenericEntityRepository מרחיב את JpaRepository {}

הגיע הזמן לבדוק את הקוד. הנה מבחן JUnit:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) מחלקה ציבורית SpringBootJPATest {@Autowired פרטי GenericEntityRepository genericEntityRepository; @Test הציבור בטל givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK () {GenericEntity genericEntity = genericEntityRepository.save (GenericEntity חדש ("מבחן")); GenericEntity foundationEntity = genericEntityRepository.findOne (genericEntity.getId ()); assertNotNull (foundationEntity); assertEquals (genericEntity.getValue (), foundationEntity.getValue ()); }}

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

5. Starter Mail

משימה שכיחה מאוד בפיתוח ארגוני היא שליחת דוא"ל, והתמודדות ישירה עם Java Mail API בדרך כלל יכולה להיות קשה.

המתנע של Spring Boot מסתיר את המורכבות הזו - ניתן לציין תלות בדואר באופן הבא:

 org.springframework.boot spring-boot-starter-mail 

כעת אנו יכולים להשתמש ישירות ב- JavaMailSenderאז בואו נכתוב כמה מבחנים.

לצורך הבדיקה אנו זקוקים לשרת SMTP פשוט. בדוגמה זו נשתמש בחכם יותר. כך אנו יכולים לכלול אותו ב- POM שלנו:

 org.subethamail subethasmtp 3.1.7 מבחן 

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

הנה קוד המקור לבדיקה:

@RunWith (SpringJUnit4ClassRunner.class) @ SpringApplicationConfiguration (מחלקות = Application.class) מחלקה ציבורית SpringBootMailTest {@ JavaMailSender פרטי מאושרים javaMailSender; פרטי חכם יותר; פרטי מחרוזת userTo = "[דוא"ל מוגן]"; פרטי מחרוזת userFrom = "[מוגן בדוא"ל]"; נושא מחרוזת פרטי = "נושא הבדיקה"; private String textMail = "דואר נושא הטקסט"; @ לפני setUp הריק הציבורי () זורק חריג {final int TEST_PORT = 25; חכם יותר = חכם חדש (TEST_PORT); wiser.start (); } @ לאחר חלל ציבורי דמעה () זורק חריג {wiser.stop (); } @Test ציבורי בטל givenMail_whenSendAndReceived_thenCorrect () זורק חריג {הודעה SimpleMailMessage = composeEmailMessage (); javaMailSender.send (הודעה); רשימת הודעות = wiser.getMessages (); assertThat (הודעות, hasSize (1)); WiserMessage wiserMessage = messages.get (0); assertEquals (userFrom, wiserMessage.getEnvelopeSender ()); assertEquals (userTo, wiserMessage.getEnvelopeReceiver ()); assertEquals (subject, getSubject (wiserMessage)); assertEquals (textMail, getMessage (wiserMessage)); } פרטי מחרוזת getMessage (WiserMessage wiserMessage) זורק את MessagingException, IOException {return wiserMessage.getMimeMessage (). getContent (). toString (). trim (); } מחרוזת פרטית getSubject (WiserMessage wiserMessage) זורק את MessagingException {להחזיר wiserMessage.getMimeMessage (). getSubject (); } פרטי SimpleMailMessage composeEmailMessage () {SimpleMailMessage mailMessage = חדש SimpleMailMessage (); mailMessage.setTo (userTo); mailMessage.setReplyTo (userFrom); mailMessage.setFrom (userFrom); mailMessage.setSubject (נושא); mailMessage.setText (textMail); להחזיר mailMessage; }}

במבחן, @לפני ו @לאחר השיטות אחראיות על הפעלת ושרת הדואר.

שימו לב שאנחנו חיווטים ב JavaMailSender שעועית - השעועית הייתה נוצר אוטומטית על ידי Spring Boot.

בדיוק כמו כל ברירות מחדל אחרות ב- Boot, הגדרות הדוא"ל עבור ה- JavaMailSender יכול להיות מותאם אישית ב application.properties:

spring.mail.host = localhost spring.mail.port = 25 spring.mail.properties.mail.smtp.auth = false

אז הגדרנו את שרת הדואר אירוח מקומי: 25 ולא נדרשנו לאימות.

6. מסקנה

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

בואו נסכם את היתרונות של שימוש במתחילי Spring Boot:

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

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