Spring Boot 从入门到实践系列教程(4)- Spring Boot Starters简介

低头走路不忘抬头看路

正文之前先同步一个关于找工作小故事,最近一周帮我以前一个同事推荐工作,顺便了解下行情,我这个同事我感觉还行,技术不说有多好,但是往年绝对不至于简历筛选时被刷掉那种,最先开始推给了一个我比较信任的HR手里,她兼职猎头,推给这个HR以后,投给了某陌社交平台,她说比较悬,不一定有结果,原因是他现在的工资太低了。不到20k,如果简历在没什么亮点,会被认为你能力不行。面试的机会可能都没了。果不其然。

随后我陆陆续续又给他推荐了四个猎头,结果都一样!!!从这几个猎头口中得到的答复,可以肯定今年互联网不好找工作真不是闹着玩儿的。今年是猎头都推不出去了,原因我大概总结了几点:

  1. 猎头推荐的坑位本身就比较高端,要求也比较高。这也就是说不是找不到工作了,自己还可以找要求低一点的。直接联系企业。

  2. 简历需要“单闪”,我也是第一次听说这个词,猎头给我解释的是要么211以上,要么大厂背景,单方面有闪光点。

  3. 对技术水平要求高,往年刷题就可以搞定,现在要考察你对技术是否真的知其所以然,还有就是业务能力,你是否对项目有全面的认识。 

  4. 高潜:学历高潜力高,就是要年轻的,贵的。

但是不要恐慌,工作还是能找到的,只不过找个“合适”的工作比较难了,市场行情我们改变不了,但是我们自身还是有救的。

这几天我加了以前的校友群,19年的学弟问我10年前报考学的什么,我说计算机科学与技术,学弟说那看来你当时考的挺好的,我说不会呀,我当时报这个是因为计算机专业是分最低录取最保守的。学弟说现在计算机已经比以前高多了,计算机在整个学校分都算高的了。

我想说,三十年河东三十年河西,哪个行业也不会一直好一直不好,我上学时第一个学期院长就跟我们说,前几届的学生,一毕业就失业,计算机根本找不到工作,在你们十年前,毕业时会HTML那都能找到工作。相反我毕业那会儿互联网火起来了,我毕业后也没失业。我们没办法预测太多以后的事情,只能丰富自己的技能,以备不时之需。不然你能怎么办?你有更好的办法和出路吗?总不能因为行情不好就放弃了,那你家里的有矿。 

一个好的程序员是那种过单行线马路都要往两边看的人。

                                                                                                                                                                                                 --Doug Linder

正文:

Spring Boot 从入门到实践系列教程(4)- Spring Boot Starters简介

 

1.概述

依赖管理是任何复杂项目的关键方面。手动完成此操作并不理想; 你花在它上面的时间越多,你在项目的其他重要方面所花费的时间就越少。

构建Spring Boot启动器是为了解决这个问题。Starter POM是一组方便的依赖描述符,您可以在应用程序中包含这些描述符。您可以获得所需的所有Spring和相关技术的一站式服务,而无需搜索示例代码并复制粘贴的依赖描述符。

我们有超过30个启动启动器 - 让我们在以下部分中看到它们中的一些。

 

2.网络入门

首先,我们来看看开发REST服务; 我们可以使用像Spring MVC,Tomcat和Jackson这样的库 - 对于单个应用程序来说有很多依赖关系。

Spring Boot启动器可以通过添加一个依赖项来帮助减少手动添加的依赖项的数量。因此,不是手动指定依赖项,而是添加一个启动器,如以下示例所示:

<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类型的长和值类型的字符串。

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

我们已经创建了一个具有相当小配置的REST应用程序。

 

3.测试入门

对于测试,我们通常使用以下一组库: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工件的版本。如果以后需要升级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<GenericEntity> 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是spring-test模块的一部分,hasSize是一个Hamcrest匹配器,而@Before是一个JUnit注释。这些都可以通过导入这一个启动器依赖项来获得。

 

4.Data JPA Starter

大多数Web应用程序都有某种持久性 - 这通常是JPA。

而不是手动定义所有相关的依赖项 - 让我们改为使用启动器:

<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。

现在让我们为我们的实体创建存储库:

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

我们没有花时间指定数据库供应商,URL连接和凭据。不需要额外的配置,因为我们从可靠的Boot默认值中受益; 但当然,如有必要,仍可配置所有这些细节。

 

5.邮件启动器

企业开发中一个非常常见的任务是发送电子邮件,直接处理Java Mail API通常很困难。

Spring Boot启动程序隐藏了这种复杂性 - 可以通过以下方式指定邮件依赖项:

<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>

可以在Maven中央存储库中找到最新版本的Wiser 。

以下是测试的源代码:

@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的电子邮件设置可以在application.properties中自定义:

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

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

 

6.结论

在本文中,我们概述了Starters,解释了我们为什么需要它们,并提供了有关如何在项目中使用它们的示例。

让我们回顾一下使用Spring Boot启动器的好处:

  • 增加pom可管理性

  • 生产就绪,测试和支持的依赖配置

  • 减少项目的总体配置时间

 

 

更快更新请关注我公众号:be_coder 

公众号:【转行程序员】专注新人转行入门指导,老兵技术提升,包含各种新手学习资料,架构师技能提升系列文章,欢迎关注。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值