http://www.baeldung.com/spring-boot-starters

作者:baeldung

译者:http://oopsguy.com

1、概述

依赖管理一直是复杂项目的关键部分。使用手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他方面能付出的时间就会变得越少。

Spring Boot starter 就是为了解决这个问题而诞生的。Starter POM 是一组便捷的依赖描述符,您可以将其包含在应用程序中。您可以通过它获得所需的所有 Spring 和相关技术的一站式服务,无需专门去搜索示例代码和复制粘贴依赖。

我们有超过 30 个 Boot starter — 下文将介绍一部分。

2、Web Starter

首先,让我们来看看 REST 服务开发。我们可以使用像 Spring MVC、Tomcat 和 Jackson 这样的库,这对于单个应用程序来说是还是存在许多依赖。

Spring Boot starter 通过添加一个依赖来帮助减少手动添加依赖的数量。因此,您不要手动指定依赖,只需要添加一个 starter 即可,如下所示:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

现在我们可以创建一个 REST 控制器。为了简单起见,我们不使用数据库,只专注于 REST 控制器:

@RestController
public class GenericEntityController {
private List<GenericEntity> entityList = new ArrayList<>(); @RequestMapping("/entity/all")
public List<GenericEntity> 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 是一个简单的 bean,id 类型为 LongvalueString 类型。

就这样,应用程序可以开始运行了,您可以访问 http://localhost:8080/springbootapp/entity/all 并检查控制器是否正常工作。

我们已经创建了一个配置非常少的 REST 应用程序。

3、Test Starter

在测试方面,我们通常使用以下组合:Spring Test、JUnit、Hamcrest 和 Mockito。我们可以手动包含所有这些库,但使用以下 Spring Boot starter 方式可以自动包含这些库:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

请注意,您不需要指定工件的版本号。Spring Boot 会自动选择合适的版本 — 您仅需要指定 spring-boot-starter-parent-artifact 的版本。如果以后您想要升级 Boot 库和依赖,只需在这个地方升级 Boot 版本即可,它将会处理其余依赖的版本信息。

让我们来测试一下之前创建的控制器。

测试控制器有两种方法:

  • 使用 mock 环境
  • 使用嵌入式 Servlet 容器(如 Tomcat 或 Jetty)

在本例中,我们将使用一个 mock 环境:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SpringBootApplicationTest {
@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)));
}
}

@WebAppConfiguration 注解和 MockMVCspring-test 模块的一部分,hasSize 是一个 Hamcrest matcher,@Before 是一个 JUnit 注解。这些都可以通过导入这个 starter 依赖来引入。

4、Data JPA Starter

大多数 Web 应用程序都涉及到持久化逻辑 —— 常用的是 JPA 技术。

让我们使用 starter 的方式,而不是手动定义所有依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

现在,应用程序已经对这些数据库已经有了开箱即用的自动支持:H2、Derby 和 Hsqldb。在示例中,我们将使用 H2 数据库。

现在让我们为实体创建一个仓储(repository):

public interface GenericEntityRepository extends JpaRepository<GenericEntity, Long> {}

以下是测试代码,使用 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、Mail Starter

在企业开发中,一个非常最常见的功能就是发送电子邮件,直接使用 Java Mail API 来处理比较繁琐。

Spring Boot starter 屏蔽了这些复杂逻辑 — mail 依赖可以做得更简单:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

现在可以直接使用 JavaMailSender 来发送邮件。让我们开始编写一些测试。

为了测试,我们需要一个简单的 SMTP 服务器。在此例中,我们将使用 Wiser。将其包含到我们的 POM 中:

<dependency>
<groupId>org.subethamail</groupId>
<artifactId>subethasmtp</artifactId>
<version>3.1.7</version>
<scope>test</scope>
</dependency>

最新版本的 Wiser 可以在 Maven 中央仓库http://search.maven.org/#search|ga|1|subethasmtp)中找到。

以下是测试源码:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SpringBootMailTest {
@Autowired
private JavaMailSender javaMailSender; private Wiser wiser; private String userTo = "user2@localhost";
private String userFrom = "user1@localhost";
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<WiserMessage> 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 bean — 该 bean 是由 Spring Boot 自动创建的。

与 Boot 中的其他默认值一样,JavaMailSender 的 email 设置可以在 application.properties 中自定义:

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

我们在 localhost:25 上配置了邮件服务器,不需要进行身份验证。

6、结论

在本文中,我们介绍了 Starter,解释了为什么需要它们,并提供了如何在项目中使用它们的示例。

让我们回顾一下使用 Spring Boot starter 的好处:

  • 增强 pom 可管理性
  • 生产、测试与依赖配置支持
  • 减少项目的整体配置时间

这里https://github.com/spring-projects/spring-boot/tree/master/spring-boot-starters)可以找到相关 starter 的列表。示例源码可从这里https://github.com/eugenp/tutorials/tree/master/spring-boot)获取。

原文示例代码

https://github.com/eugenp/tutorials/tree/master/spring-boot

Spring Boot Starter 介绍的更多相关文章

  1. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

  2. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  3. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  4. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  5. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  6. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  7. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  8. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  9. 创建自己的Spring Boot Starter

    抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...

随机推荐

  1. [转载]python 详解re模块

    原文地址:python 详解re模块作者:Rocky 正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字 ...

  2. 九度OJ 1013 开门人和关门人

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  3. 【集美大学1411_助教博客】团队作业9——测试与发布(Beta版本)

    写在前面的话 已经看到了大家的发布成果,很欣喜,虽然有的团队的产品还是有一点问题,但大家也都发布成功了,这就是软件的魅力.但还是要说一些问题,大家录的视频不是没人讲解就是讲得太快,在我看来这都没有在卖 ...

  4. 201521123102 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在实验中,Sc ...

  5. 201521123100 《Java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代 ...

  6. 201521123044 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...

  7. 201521123032 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  8. 201521123048 《java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...

  9. java:java构造器和java方法的区别

    构造函数(构造器)是一种特殊的函数.其主要功能是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.构造函数与类名相同,可重载多个不同的构造函数.在JA ...

  10. python之异常

    一.异常与错误 1.语法错误 错误一: if 错误二: def text: pass 错误三: print(sjds 2.逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num ...