Въведение в Spring Boot Starters

1. Общ преглед

Управлението на зависимостите е критичен аспект на всеки сложен проект. И това ръчно е по-малко от идеалното; колкото повече време сте отделили за него, толкова по-малко време имате за другите важни аспекти на проекта.

Spring Boot стартери са създадени, за да се справи точно с този проблем. Стартовите POM са набор от удобни дескриптори на зависимости, които можете да включите във вашето приложение. Получавате универсално обслужване за цялата пролет и свързаната с нея технология, от която се нуждаете, без да се налага да търсите примерни кодове и да копирате-поставяте товари от дескриптори на зависимости.

Имаме на разположение повече от 30 стартера за стартиране - нека видим някои от тях в следващите раздели.

2. Уеб стартерът

Първо, нека да разгледаме разработването на услугата REST; можем да използваме библиотеки като Spring MVC, Tomcat и Jackson - много зависимости за едно приложение.

Предприемачите на Spring Boot могат да помогнат за намаляване на броя на ръчно добавените зависимости само чрез добавяне на една зависимост. Така че вместо да задавате ръчно зависимостите, просто добавете един стартер, както е в следния пример:

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

Сега можем да създадем контролер REST. За по-голяма простота няма да използваме базата данни и ще се фокусираме върху контролера REST:

@RestController public class GenericEntityController { private List entityList = new ArrayList(); @RequestMapping("/entity/all") public List findAll() { return entityList; } @RequestMapping(value = "/entity", method = RequestMethod.POST) public GenericEntity addEntity(GenericEntity entity) { entityList.add(entity); return entity; } @RequestMapping("/entity/findby/{id}") public GenericEntity findById(@PathVariable Long id) { return entityList.stream(). filter(entity -> entity.getId().equals(id)). findFirst().get(); } }

В GenericEntity е прост боб с номер от типа Long и стойност от тип String .

Това е - с изпълняваното приложение можете да осъществите достъп // // localhost: 8080 / entity / all и да проверите дали контролерът работи.

Създадохме REST приложение с доста минимална конфигурация.

3. Тестовият стартер

За тестване обикновено използваме следния набор от библиотеки: Spring Test, JUnit, Hamcrest и Mockito. Можем да включим всички тези библиотеки ръчно, но стартерът на Spring Boot може да се използва за автоматично включване на тези библиотеки по следния начин:

 org.springframework.boot spring-boot-starter-test test 

Забележете, че не е необходимо да указвате номера на версията на артефакт. Spring Boot ще разбере каква версия да използва - всичко, което трябва да посочите, е версията на spring-boot-starter-parent артефакт. Ако по-късно трябва да надстроите Boot библиотеката и зависимостите, просто надстройте Boot версията на едно място и тя ще се погрижи за останалото.

Нека всъщност да тестваме контролера, който създадохме в предишния пример.

Има два начина за тестване на контролера:

  • Използване на фалшива среда
  • Използване на вградения контейнер на Servlet (като Tomcat или Jetty)

В този пример ще използваме фалшива среда:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest { @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void setupMockMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")). andExpect(MockMvcResultMatchers.status().isOk()). andExpect(MockMvcResultMatchers.content().contentType(contentType)). andExpect(jsonPath("$", hasSize(4))); } }

Горният тест извиква / entity / all крайна точка и проверява дали JSON отговорът съдържа 4 елемента. За да премине този тест, трябва също да инициализираме нашия списък в класа на контролера:

public class GenericEntityController { private List entityList = new ArrayList(); { entityList.add(new GenericEntity(1l, "entity_1")); entityList.add(new GenericEntity(2l, "entity_2")); entityList.add(new GenericEntity(3l, "entity_3")); entityList.add(new GenericEntity(4l, "entity_4")); } //... }

Важното тук е, че анотацията @WebAppConfiguration и MockMVC са част от модула за пролетен тест , hasSize е съвпадение на Hamcrest, а @Before е анотация JUnit. Всички те са достъпни чрез импортиране на една тази стартерна зависимост.

4. Data JPA Starter

Повечето уеб приложения имат някакъв вид постоянство - и това доста често е JPA.

Вместо да дефинирате всички свързани зависимости ръчно - нека отидем със стартера вместо това:

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

Забележете, че веднага имаме автоматична поддръжка поне за следните бази данни: H2, Derby и Hsqldb. В нашия пример ще използваме H2.

Сега нека създадем хранилището за нашия обект:

public interface GenericEntityRepository extends JpaRepository {}

Време е да тествате кода. Ето теста JUnit:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) public class SpringBootJPATest { @Autowired private GenericEntityRepository genericEntityRepository; @Test public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() { GenericEntity genericEntity = genericEntityRepository.save(new GenericEntity("test")); GenericEntity foundedEntity = genericEntityRepository.findOne(genericEntity.getId()); assertNotNull(foundedEntity); assertEquals(genericEntity.getValue(), foundedEntity.getValue()); } }

Не отделяхме време за посочване на доставчик на база данни, URL връзка и идентификационни данни. Не е необходима допълнителна конфигурация, тъй като се възползваме от солидните настройки на Boot по подразбиране; но разбира се всички тези подробности все още могат да бъдат конфигурирани, ако е необходимо.

5. The Mail Starter

Много често срещана задача в корпоративното развитие е изпращането на имейли и директната работа с Java Mail API обикновено може да бъде трудна.

Spring Boot starter крие тази сложност - зависимостите от пощата могат да бъдат посочени по следния начин:

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

Сега можем директно да използваме JavaMailSender , така че нека напишем някои тестове.

За целите на тестването се нуждаем от прост SMTP сървър. В този пример ще използваме Wiser. Ето как можем да го включим в нашия POM:

 org.subethamail subethasmtp 3.1.7 test  

Най-новата версия на Wiser може да бъде намерена в централното хранилище на Maven.

Ето изходния код за теста:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) public class SpringBootMailTest { @Autowired private JavaMailSender javaMailSender; private Wiser wiser; private String userTo = "[email protected]"; private String userFrom = "[email protected]"; private String subject = "Test subject"; private String textMail = "Text subject mail"; @Before public void setUp() throws Exception { final int TEST_PORT = 25; wiser = new Wiser(TEST_PORT); wiser.start(); } @After public void tearDown() throws Exception { wiser.stop(); } @Test public void givenMail_whenSendAndReceived_thenCorrect() throws Exception { SimpleMailMessage message = composeEmailMessage(); javaMailSender.send(message); List messages = wiser.getMessages(); assertThat(messages, hasSize(1)); WiserMessage wiserMessage = messages.get(0); assertEquals(userFrom, wiserMessage.getEnvelopeSender()); assertEquals(userTo, wiserMessage.getEnvelopeReceiver()); assertEquals(subject, getSubject(wiserMessage)); assertEquals(textMail, getMessage(wiserMessage)); } private String getMessage(WiserMessage wiserMessage) throws MessagingException, IOException { return wiserMessage.getMimeMessage().getContent().toString().trim(); } private String getSubject(WiserMessage wiserMessage) throws MessagingException { return wiserMessage.getMimeMessage().getSubject(); } private SimpleMailMessage composeEmailMessage() { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(userTo); mailMessage.setReplyTo(userFrom); mailMessage.setFrom(userFrom); mailMessage.setSubject(subject); mailMessage.setText(textMail); return mailMessage; } }

При изпитването на @Before и @After методи са отговорни за пускане и спиране на пощенския сървър.

Забележете, че свързваме кабела в JavaMailSender боб - бобът е създаден автоматично от Spring Boot .

Подобно на всички други настройки по подразбиране в Boot, настройките за имейл за JavaMailSender могат да бъдат персонализирани в application.properties :

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

Така че конфигурирахме пощенския сървър на localhost: 25 и не изисквахме удостоверяване.

6. Заключение

В тази статия дадохме преглед на начинаещите, обяснихме защо ни трябват и предоставихме примери как да ги използваме във вашите проекти.

Нека да обобщим предимствата на използването на начинаещи Spring Boot:

  • увеличаване на управляемостта на pom
  • готови за производство, тествани и поддържани конфигурации на зависимост
  • намаляване на общото време за конфигуриране на проекта

Действителният списък с начинаещи можете да намерите тук. Изходният код за примерите можете да намерите тук.