SpringBoot 的第一次邂逅

631 阅读6分钟

前言

在介绍 SpringBoot 之前,我们首先要隆重介绍一下 Spring 框架。在上古时期,人们通常用 J2EE 那一套东西来开发企业级应用。笨重复杂的 EJB 的开发和部署让程序员们不胜其烦。其时 Spring 框架横空出世,通过核心的依赖注入、AOP、事务管理等核心功能,几乎一统 Java 的企业级开发应用框架。经过十多年的发展,Spring 也从开始动作敏捷的妙龄少女慢慢变成了身材臃肿的中年大妈。随着功能越来越多,越来越强大,Spring 的配置的工作量也随之增大。长长的配置文件通常折磨得程序员们欲仙欲死。喜新厌旧的程序员们又开始看 Spring 不顺眼了。这次则是 Spring Boot 站出来,挽回了程序员们对 Spring 的宠爱。

Spring Boot 并不是一个全新的东西,他是基于 Spring 的。可以说 SpringBoot 的目的就是让程序员用最简单的方式来开发 Spring 应用的。Spring Boot 通过一种约定的编程模式,简化基于 Spring 的开发。尽量减少程序配置的工作。在 Spring Boot 的开发过程中,几乎看不到传统 Java Web 开发的的各种 XML 配置文件。有人说 Spring 基于注解的配置方式也可以做到没有 XML 文件配置,但是 Spring Boot 甚至于连 web.xml 文件都没有了,这就看出谁更狠了。而且 Spring Boot 开发的程序不再是一个 war 包的形式,放到一个类似 Tomcat 这样的 web 容器中运行,而是一个独立的 jar 包,直接通过 java -jar xxxxx.jar 的形式就可以运行。当然,Spring Boot 也支持 war 包运行的方式。

Spring Boot 除了 Spring 本身的优点外,还提供了一下几点特性:

  1. 他可以创建独立运行的基于 Spring 的应用。因为 Spring Boot 内嵌了 Tomcat、Jetty、Undertow 应用服务器,所以他不需要部署一个 war 文件到一个单独的应用服务器中来运行。
  2. 他简化了项目依赖的配置。Spring Boot 对我们在 Java Web 开发过程中的功能进行了分类和封装,通过提供了一些可选的 "starter" POMs 来简化 Maven 配置。
  3. 尽可能自动化Spring 的配置。Spring Boot 通过一些列的编程约定和注解来替代传统的 XML 配置方式。减少 Spring 开发过程中的配置工作量。让开发的配置变得更加简单。
  4. 产品级的应用监控。通过简单的引入对应的依赖,Spring Boot 就能自动的在产品中加入产品级的监控和管理的功能。包括健康检查、性能测量等。

总之,有了 Spring Boot ,我们能够更方便的开发、部署、监控 Spring 的应用程序了。

下面我们就用一个最简单的 Hello Word 来快速了解一下 Spring Boot 的强大之处。

创建工程

在 Intellij 中新建工程,在对话框中选择 Spring Initializr

选择项目类型

然后选择 "Next" 填写工程的基本信息

填写项目信息

继续选择 "Next" 选择工程要包含的 Spring Boot 支持的功能组件。如果你没有想好要哪些功能组件,这一步可以不用选,后面我们可以在 maven 的 pom 文件中自己添加。

选择功能组件

然后,一直选择 "Next" ,知道最后选择 "Finish" 完成工程的创建。 如果是第一次创建 Spring Boot工程,需要等待一段时间来完成从互联网下载相关依赖包的过程。

完成后,整个 Srping Boot 初始的工程结构如下所示:

image.png

前一两天刚刚发布了 Spring Boot 2.0 的版本,所以现在默认的 Spring Boot 版本如红框部分所示为 2.0.0.REALEASE。

由于我们在创建的过程中,没有选择其他的功能组件,这里只有 spring-boot-starter 这一个核心的依赖。

SpringbootLearnApplication 是默认的系统启动类,application.properties 文件是系统默认的配置项配置文件。

其中 SpringbootLearnApplication 类是系统自动生成的,一个 SpringBootApplication 注解声明这是一个 SpringBoot 的应用。类只有一行代码 SpringApplication.run(SpringbootLearnApplication.class, args) 用来启动 SpringBoot 程序。

package com.yanggaochao.springboot.springbootlearn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootLearnApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootLearnApplication.class, args);
	}
}

创建一个 Http Rest 服务

在我们的工作中,通常都是用 Spring Boot 来完成一个 Http Rest 服务。这属于 web 相关的功能,需要在 pom 文件中加入下面的依赖

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

配置 SpringBoot

一个 Http 服务需要配置 SpringBoot 程序运行服务的端口和上下文路径。这些信息默认是通过 properties 的方式配置在 applications.properties 文件中。如下所示

server.port=3030
server.servlet.context-path=/learn

这里将 SpringBoot 的服务地址配置为 3030,服务的上下文路径配置为 /learn。

注意:这个 server.servlet.context-path 这个配置是对应了 SpringBoot1.x 版本中的 server.context-path

编写 Http Rest 接口 hello

  1. 新建一个类 com.yanggaochao.springboot.springbootlearn.web.HelloApi 来提供服务。
  2. 在类声明上增加一个 RestController 注解,声明这个类是一个 Http Rest 服务。
  3. 在类声明上增加一个 RequestMapping("/api/v1/hello") 的注解,用来声明这个 Rest 服务的地址前缀。
  4. 写一个sayHello 方法提供 say hello 服务。其中参数 name 前面的 PathVariable 注解用来声明这个参数从服务的 url 路径中获取。
  5. 在 sayHello 方法上增加一个 RequestMapping("/say/{name}") 声明这个方法的服务地址。实际地址是 (http|https)://ip:3030/learn/api/v1/hello/say/{name}。这里还应该指明请求服务的方法,如果不写就是默认值 GET 方法来请求。
package com.yanggaochao.springboot.springbootlearn.web;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 样例 Http Rest 服务
 *
 * @author 杨高超
 * @since 2018-03-06
 */

@RestController
@RequestMapping("/api/v1/hello")
public class HelloApi {
    @RequestMapping("/say/{name}")
    String sayHello(@PathVariable String name) {
        return "Hello," + name + "!";
    }
}

启动 SpringBoot 应用

SpringBoot 应用是通过 SpringbootLearnApplication 的 main 方法启动的。在 Intellij IDEA 中,在 main 方法体类点击鼠标右键,和普通 Java 应用一样,选择 Run 或者 Debug 都可以运行。

运行 SpringBoot

SpringBoot 启动后,首先打印 SpringBoot 应用的 banner 信息,然后是启动日志。

SpringBoot 启动

验证

GET 方法的 Http Rest 请求可以直接在浏览器地址栏上请求。我们在 Chrome 地址栏输入 http://localhost:3030/learn/api/v1/hello/say/yanggch , 则会在浏览器中显示 Hello,yanggch!

请求结果

打包

maven 项目可以通过 maven 的 package 命令构建部署包。点击 IDEA 右侧的 Maven Project 标签打开如下界面,点击红框内容既完成部署包的生成。生成的目录是项目目录下的 target 目录下。SpringBoot 的部署包默认是一个独立的 elementary-0.0.1-SNAPSHOT.jar 文件。将所有相关的文件都包含到这个包中。

maven 构建

命令行运行

前面程序的运行是在 IDEA 工具里面运行的。实际部署中,SpringBoot 程序是通过命令行运行的。

进入 SpringBoot 构建的部署所在的目录,执行 java -jar elementary-0.0.1-SNAPSHOT.jar 命令就可以启动 SpringBoot 应用了。

命令行启动

后记

就这样,我们仅仅写了几行代码,设置了两个配置项,就实现了一个基本的 Http Rest 服务接口。是不是非常的快速和简单。对比一下采用传统的方法开发一个 Spring Http Rest 服务的步骤和 Srping Boot 开发的步骤就可以看出 SpringBoot 开发的便捷性了。而且 SpringBoot 还可以独立的运行。更厉害的是 SpringBoot 可以非常好的和流行的微服务框架 Spring Cloud 结合。可以说 SpringBoot 几乎是为微服务量身打造的。

原文发表在简书中,原始链接