为什么都喜欢采用 Spring Boot 来开发软件系统?

熟悉企业级开发框架的同学,对 SpringBoot 可能并不陌生,它是一款非常优秀的开箱即用的开发框架,开发者可以使用它来快速的构建一个可独立运行的 Java 应用程序。

尤其是在分布式领域,SpringBoot 通常用于快速构建微服务应用,比如交易子系统、供应链子系统、物流子系统、结算子系统等。

01、简介

SpringBoot 之所以如此的流行,主要在于它能帮助开发者预组装 Spring 的一系列组件,同时通过简化配置的方式,进一步的帮忙开发者减轻了基于 Spring 的应用程序的搭建和开发难度。

SpringBootSpring 的关系,就好比整车和零部件的关系,Spring 相当于发动机、底盘、汽车外壳等零部件,但是要想上路,还得自己动手拼装,配置很繁琐;而 SpringBoot 相当于帮我们预装了一辆汽车,各零部件还是 Spring 提供的,用户可以直接开车上路。

由此可见,两者并非取代关系,如果想要深度掌握 SpringBoot,了解 Spring 也同样至关重要。

SpringBoot 和 Spring 的版本关系,可以用如下内容来概括。

不同的版本,对系统环境的要求是不一样的,如果出现不兼容的现象,请确保系统环境满足最低要求。

02、快速入门

下面我们以创建一个 SpringBoot 应用为例,并实现一个简单的 Http 请求处理。通过这个例子,一起来体验一下 SpringBoot 中开箱即用的特性。

快速创建 SpringBoot 项目,通常有两种方式:

  • 第一种:使用 Spring Initializr 页面快速创建
  • 第二种:手动创建

下面我们一起来看看。

2.1、使用 Spring Initializr 页面创建

Spring Initializr 是 Spring 官方提供一个快速创建 SpringBoot 应用的便捷工具。

使用方式很简单,访问https://start.spring.io/地址,我们会看到如下界面。

填写相应的信息,最后点击Generate按钮,即可快速导出一个 SpringBoot 工程文件。

也可以点击Explore按钮,查看生成的文件目录结构。

从图中可以看出,Spring Boot 的基础结构共三个文件。

  • src/main/java:程序开发以及主程序入口
  • src/main/resources:配置文件
  • src/test/java:测试程序

将文件导入到IntelliJ IDEA中,运行SpringbootHelloApplicationmain方法,即可启动服务。

这种创建方式,虽然很快速但是不够灵活,通常采用的是官方最新版本,如果当前环境不满足要求,比如当前系统环境 JDK 版本为 8,可能服务无法运行哦。

2.2、手动创建

手动构建项目是最常用的一种方式,以IntelliJ IDEA为例,构建步骤如下。

2.2.1、创建一个 maven 项目

打开 IntelliJ IDEA,在菜单栏中选择File => New => Project..,我们可以看到如下图所示的窗口。

选择Maven,然后点击Next

填写相关的工程信息之后,继续点击Next,直到Finish,此时 Maven 项目创建完成。

2.2.2、添加 SpringBoot 依赖包

根据上文的版本对应关系,如果当前系统环境 JDK 版本为 8, SpringBoot 的适配版本为2.x,如果你当前系统环境 JDK 版本也是8,可以采用2.1.0.RELEASE版本来构建项目。

打开pom.xml文件,添加 SpringBoot 相关依赖包,内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--引入spring boot父类-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-hello</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--添加相关依赖包-->
    <dependencies>
        <!--spring boot核心-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--spring boot 测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--springmvc web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!--添加项目打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
2.2.3、创建配置文件

src/main/resources目录下,创建一个application.properties全局配置文件,内容如下:

spring.application.name=springboot-hello
2.2.4、编写服务启动类

src/main/java目录下,创建一个服务启动类Application,包名为com.example.springboot,代码如下。

package com.example.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
2.2.5、编写一个HTTP接口

src/main/java目录下,创建一个 http 接口,包名为com.example.springboot.web,代码如下。

package com.example.springboot.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String index() {
        return "Hello World!";
    }
}
2.2.6、启动服务测试

最后运行Application类,即可启动 SpringBoot 应用程序,服务日志如下。

在浏览器中输入http://localhost:8080/hello,可以看到页面返回:Hello World!

2.2.7、编写单元测试用例

src/test/java目录下,可以编写一个单元测试来模拟 http 请求,创建一个ApplicationTests单元测试类,包名为com.example.springboot,代码如下。

package com.example.springboot;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    private MockMvc mvc;
    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }
    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Hello World!")));
    }
}

至此,通过 Maven 构建一个 SpringBoot 项目基本完成,整个工程目录结构如下:

03、小结

可以发现,使用 Spring Boot 可以非常方便、快速的搭建 web 项目,开发者不用关心框架之间的兼容性、版本号等问题,任何你想要的组件,只需要添加一下依赖包即可,真正做到了开箱即用的效果。

打开 Maven Project 工程中的 Dependencies 按钮,可以看到 SpringBoot 项目中的依赖包如下。

当添加 SpringBoot 相关依赖包时, Maven 会自动从中央仓库拉取相关组件,然后打包到工程中。SpringBoot 相当于一个框架的管理者,默认整合了很多框架的使用方式,开发者要使用某个框架时,只需要配置一下即可。

另外需要注意的地方是:SpringBootApplication注解默认扫描当前包下的相关类,如果把HelloController类所在的包移动到 com.example.springboot包之外是无法被扫描到,会导致请求出错,例如如下这种结构。

com
  +- example
    +- springboot
      +- Application.java
    +- web
    |  +- HelloController.java
    |

面对这种情况,可以在SpringBootApplication注解下,新增一个扫包注解,自定义扫描包的路径,例如如下方式。

@SpringBootApplication
@ComponentScan(basePackages="com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在实际的开发过程中,通常建议按照推荐的方式来划分包目录,将SpringBootApplication注解所在的位置放在最顶层,例如如下官方推荐的结构。

com
 +- example
     +- myproject
         +- Application.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerDao.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderDao.java

关于 Spring Boot 更多的 web 开发用法,我们在下篇文章中再给大家介绍。

04、参考

1、spring官网

3