1. Обзор
Управление зависимостями-важнейший аспект любого сложного проекта. И делать это вручную далеко не идеально; чем больше времени вы потратили на это, тем меньше времени у вас остается на другие важные аспекты проекта.
Стартеры Spring Boot были созданы именно для решения этой проблемы. Стартовые POM-это набор удобных дескрипторов зависимостей, которые вы можете включить в свое приложение. Вы получаете универсальный магазин для всех необходимых вам технологий Spring и связанных с ними технологий, без необходимости искать примеры кода и копировать-вставлять множество дескрипторов зависимостей.
У нас доступно более 30 загрузочных стартеров – давайте рассмотрим некоторые из них в следующих разделах.
2. Веб-стартер
Во – первых, давайте рассмотрим разработку службы REST; мы можем использовать такие библиотеки, как Spring MVC, Tomcat и Jackson-множество зависимостей для одного приложения.
Запуск Spring Boot может помочь уменьшить количество добавляемых вручную зависимостей, просто добавив одну зависимость. Поэтому вместо того, чтобы вручную указывать зависимости, просто добавьте один стартер, как в следующем примере:
org.springframework.boot spring-boot-starter-web
Теперь мы можем создать контроллер REST. Для простоты мы не будем использовать базу данных и сосредоточимся на RestController:
@RestController public class GenericEntityController { private ListentityList = 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(); } }
Сущность Generic представляет собой простой компонент с id типа Long и значением типа String .
Вот и все – с запущенным приложением вы можете получить доступ http://localhost:8080/entity/all и проверьте, работает ли контроллер.
Мы создали приложение REST с довольно минимальной конфигурацией.
3. Тестовый Стартер
Для тестирования мы обычно используем следующий набор библиотек: Spring Test, JUnit, Hamcrest и Mockito. Мы можем включить все эти библиотеки вручную, но Spring Boot starter можно использовать для автоматического включения этих библиотек следующим образом:
org.springframework.boot spring-boot-starter-test test
Обратите внимание, что вам не нужно указывать номер версии артефакта. Spring Boot определит, какую версию использовать – все, что вам нужно указать, это версия spring-boot-starter-parent artifact. Если позже вам понадобится обновить библиотеку загрузки и зависимости, просто обновите версию загрузки в одном месте, и она позаботится обо всем остальном.
Давайте на самом деле протестируем контроллер, который мы создали в предыдущем примере.
Существует два способа тестирования контроллера:
- Использование макетной среды
- Использование встроенного контейнера сервлетов (например, 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 ListentityList = 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 являются частью модуля spring-test , имеет размер является сопоставителем Hamcrest и @Before является аннотацией JUnit. Все они доступны при импорте одной этой стартовой зависимости.
4. Стартер данных JPA
Большинство веб – приложений обладают какой-то устойчивостью-и это довольно часто 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-адресу и учетных данных. Никакая дополнительная конфигурация не требуется, поскольку мы извлекаем выгоду из твердых настроек загрузки по умолчанию; но, конечно, все эти детали все еще могут быть настроены при необходимости.
5. Стартер Почты
Очень распространенной задачей в развитии предприятия является отправка электронной почты, и работа непосредственно с 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); Listmessages = 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 bean – боб был автоматически создан 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
- готовые к производству, протестированные и поддерживаемые конфигурации зависимостей
- сократите общее время настройки проекта
Фактический список стартеров можно найти здесь . Исходный код для примеров можно найти здесь .