Spring Boot Starters简介及其优劣势

时间:2022-09-07 18:08:11

简介

在启动任何项目(无论是小型项目还是企业级应用程序)之前,其中关键的方面之一是依赖管理,手动为小型应用程序执行依赖管理并不是一项困难的工作,但对于复杂的应用程序,手动管理所有项目依赖并不理想,容易出现许多问题以及浪费时间,而这些时间可以用于项目的其他一些重要方面。

spring boot背后的基本原理之一就是解决类似的问题。spring boot starter是一套方便的依赖描述符,可以很容易地包含在任何级别的应用程序中。这些starters作为spring相关技术的引导过程,我们 不再需要担心依赖关系,它们将由spring boot starters自动管理。

starters包含了许多你需要的依赖项,以使项目快速启动和运行,并且具有一致的、被支持的一组管理传递依赖项。

1. 为什么我们需要starters?

当我们用spring boot开始开发应用时,我们想到的一个基本问题就是为什么我们需要spring boot starters? 或者这些starters在我的应用中如何帮助到我?

如前所述,这些starters用于引导应用程序,我们需要的只是在应用程序中包括正确的starters,而spring boot将确保所选starters所需的所有依赖项都在你的classpath中。

为了更清楚地理解它,我们举一个例子,我们想构建一个简单的spring web mvc应用程序,我们需要在开始编写我们的web应用程序代码之前考虑以下几点。

  • 正确的spring mvc依赖
  • web技术所需的依赖(例如,我们想要使用thymeleaf)
  • 我们需要确保所有这些依赖是兼容的

使用spring boot starters来引导我们的spring mvc web应用程序非常简单,我们需要在我们的pom.xml中包含spring-boot-starter-web 这个starter:

?
1
2
3
4
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
</dependency>

以上pom.xml中的条目将确保所有必需的依赖项都应位于classpath中,因此我们都准备好开始开发web应用程序了。

目前,spring boot提供的starters约有50多个,这还不包括第三方的starters。有关starters的更新列表,请参阅spring boot starter

接下来,我将介绍一些常用的starters。

2. web starter

这是最常用的spring boot starter之一,该starter将确保创建spring web应用程序(包括rest)所需的所有依赖包括在你的calsspath中,它还将添加tomcat-starter作为默认服务器来运行我们的web应用程序。 要在我们的应用程序中包含web starter,请在pom.xml中添加以下条目。

?
1
2
3
4
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-web</artifactid>
</dependency>

现在我们可以创建我们的spring mvc controller

?
1
2
3
4
5
6
7
8
@restcontroller
 public class samplecontroller{
 
  @requestmapping("/greeting")
  stringhello(){
    return "helloworld!";
  }
}

如果你运行应用程序并访问 http://localhost:8080/greeting,你应该能够获得"hello word”作为响应。我们使用最少的代码创建了一个rest控制器。

3. data jpa starter

大多数应用程序需要一些持久性机制,而jpa是持久性的标准,spring boot starters带有jpa starters,你不再需要手动配置这些jpa依赖,而是可以通过在应用程序中添加jpa starter轻松实现。

?
1
2
3
4
5
6
7
8
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<dependency>
  <groupid>com.h2database</groupid>
  <artifactid>h2</artifactid>
</dependency>

spring jpa starter提供对h2,derby和hsqldb的自动支持。让我们看看使用jpa starter创建一个jpa样例应用程序是多么容易。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@entity
public class user{
  @id
  @generatedvalue(strategy = generationtype.auto)
  private long id;
  private string firstname;
  private string lastname;
  protected user(){
  }
  public user(string firstname, string lastname){
    //this.id = id;
    this.firstname = firstname;
    this.lastname = lastname;
  }
  public long getid(){
    return id;
  }
  public void setid(long id){
    this.id = id;
  }
  public string getfirstname(){
    return firstname;
  }
  public void setfirstname(string firstname){
    this.firstname = firstname;
  }
  public string getlastname(){
    return lastname;
  }
  public void setlastname(string lastname){
    this.lastname = lastname;
  }
  @override
  public string tostring(){
    return "user{" +
        "id=" + id +
        ", firstname='" + firstname + '\'' +
        ", lastname='" + lastname + '\'' +
        '}';
  }
}

如下是我们的userrepository:

?
1
2
3
public interface userrepositoryextends crudrepository<user,long>{
  list<user>finduserbylastname(string lastname);
}

接下来我们可以测试我们的代码了,如下是junit代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@runwith(springrunner.class)
@springboottest
public class jpademoapplicationtests{
  @autowired
  userrepository userrepository;
  @test
  public void contextloads(){
    user user = userrepository.save(new user("demo","user"));
    user searchuser= userrepository.findone(user.getid());
    assertnotnull(searchuser);
    assertequals(user.getfirstname(),searchuser.getfirstname());
  }
}

正如我们在上面的代码中看到的那样,你不再需要指定那些数据库配置或额外的数据库配置,通过添加jpa starter,我们无需配置或编码即可获得许多开箱即用的功能。

如果需要,你始终可以修改或自定义这些配置。

4. mail starter

从应用程序发送电子邮件是非常常见的任务,现在每个应用程序都需要从系统发送电子邮件。spring boot mail starter提供了一种隐藏所有复杂性的简单方法来处理此功能。

我们可以通过在应用程序中添加mail starter来启用电子邮件支持。

?
1
2
3
4
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-mail</artifactid>
</dependency>

我正在使用mailgun作为我的smtp服务器,以下是添加到我的application. properties文件中的smtp详细信息:

?
1
2
3
4
5
6
spring.mail.host=smtp.mailgun.org
spring.mail.username=postmaster@domain.com
spring.mail.password=mypassword
spring.mail.properties.mail.transport.protocol=smtp
spring.mail.properties.mail.smtp.port=587
spring.mail.properties.mail.smtp.auth=true

我们的emailservice类负责发送邮件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@component
public class javaemailservice{
  private javamailsender mailsender;
  public javaemailservice(javamailsender mailsender){
    this.mailsender = mailsender;
  }
  public void sendemail(){
    mimemessagepreparator messagepreparator = mimemessage -> {
      mimemessagehelper helper = new mimemessagehelper(mimemessage);
      helper.setfrom("noreply@javadevjournal.com");
      helper.setto("xxx@gmail.com");
      helper.setsubject("sample mail subject");
      helper.settext("test email");
    };
    mailsender.send(messagepreparator);
  }
}

我们使用spring提供的javamailsender来发送电子邮件。 junit测试代码如下:

?
1
2
3
4
5
6
7
8
9
10
@runwith(springrunner.class)
@springboottest
public class emailtest{
  @autowired
  javaemailservice javaemailservice;
  @test
  public void sendemail(){
    javaemailservice.sendemail();
  }
}

同样,只需简单的代码和配置即可发送一封简单的电子邮件,spring boot mail starter确保所有必需的工具已经到位,以快速开始解决实际问题。

请注意,我们在javaemailservice bean中使用javamailsender - 该bean是由spring boot自动创建的。

5. test starter

我们通常使用junit、mockito或spring test来测试我们的应用程序。我们可以通过添加spring boot test starter轻松地将所有这些库包含在我们的应用程序中。

?
1
2
3
4
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-test</artifactid>
</dependency>

spring boot会自动找到我们正确的版本用于我们的应用程序测试。 这是一个junit示例测试:

?
1
2
3
4
5
6
7
8
9
10
@runwith(springrunner.class)
@springboottest
public class emailtest{
  @autowired
  javaemailservice javaemailservice;
  @test
  public void sendemail(){
    javaemailservice.sendemail();
  }
}

除了这些starter之外,下面还有其他常用的spring boot starter

?
1
2
3
4
5
spring-boot-starter-security
spring-boot-starter-web-services
spring-boot-starter-integration
spring-boot-starter-validation
spring-boot-starter-actuator

如前所述,请参阅 spring boot starter 获取spring boot提供的starter的最新列表。

总结

本文提供了一个spring boot starters简介,我们讨论了为什么我们需要这些starter以及他们如何帮助我们快速引导我们的应用程序。 我们探索了一些最常用的spring boot starter。

原文链接:http://szpzs.oschina.io/2018/05/24/spring-boot-starters/