小试 Spring Boot - Spring MVC

前阵想试下 Spring MVC 4 有了些什么新特性, 可真正用 Maven 在 IDE 中建立一个项目并不那么容易. Spring 当初在笑 EJB 的笨重时如今把自己也搞大了, 继而出台了一个 Spring Boot 来响应微服务的号召.


Spring Boot 的出世可以大大提升使用 Spring 框架时的开发效率. Spring 尽量简化 Spring 项目的配置, 一个 mvn package 就轻轻松的把一个 Web 项目打成一个  fat jar, 运行 java -jar spring-boot-sample-1.0-SNAPSHOT.jar 就能通过内嵌的 Tomcat 或 Jetty 来启动一个 Web 应用了, 更别提怎么应对普通控制台应用了.

现在就来体验一下 Spring Boot 做一个 Spring MVC 项目有多简单, 我们仍然是建立一个 Maven 项目, 最简单的 pom.xml 文件内容如下:
 1<?xml version="1.0" encoding="UTF-8"?>
 2<project xmlns="http://maven.apache.org/POM/4.0.0"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5    <modelVersion>4.0.0</modelVersion>
 6
 7    <groupId>cc.unmi</groupId>
 8    <artifactId>spring-boot-sample</artifactId>
 9    <version>1.0-SNAPSHOT</version>
10
11    <parent>
12        <groupId>org.springframework.boot</groupId>
13        <artifactId>spring-boot-starter-parent</artifactId>
14        <version>1.4.1.RELEASE</version>
15    </parent>
16    <dependencies>
17        <dependency>
18            <groupId>org.springframework.boot</groupId>
19            <artifactId>spring-boot-starter-web</artifactId>
20        </dependency>
21    </dependencies>
22</project>

上面的 pom.xml 配置通过 parent spring-boot-starter-parent 项目和对 spring-boot-starter-web 的依赖把相关的依赖都引入到本项目中来了.

然后是一个基本实现,  SampleController 类
 1package hello;
 2
 3import org.springframework.boot.SpringApplication;
 4import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 5import org.springframework.stereotype.Controller;
 6import org.springframework.web.bind.annotation.RequestMapping;
 7import org.springframework.web.bind.annotation.ResponseBody;
 8
 9@Controller
10@SpringBootApplication
11public class SampleController {
12
13    @RequestMapping("/")
14    @ResponseBody
15    String home() {
16        return "Hello World!";
17    }
18
19    public static void main(String[] args) throws Exception {
20        SpringApplication.run(SampleController.class, args);
21    }
22}

这里的注解 @SpringBootApplication 替换成 @EnableAutoConfiguration 也行, 但是前者更强大, 因为它是后者加上 @Configuration 和 @ComponentScan 的组合.

上面是一个 main 函数, 可以立马在 IDE 中直接运行这个主类, 能够看到控制台输出
 1  .   ____          _            __ _ _
 2 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
 3( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 4 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
 5  '  |____| .__|_| |_|_| |_\__, | / / / /
 6 =========|_|==============|___/=/_/_/_/
 7 :: Spring Boot ::        (v1.4.1.RELEASE)
 8...........................
 92016-10-05 23:21:05.260 INFO 88095 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
102016-10-05 23:21:05.271 INFO 88095 --- [ main] hello.SampleController : Started SampleController in 7.402 seconds (JVM running for 8.102)

访问 http://localhost:8080/, 得到预计的输出
1➜ / curl -i http://localhost:8080/
2HTTP/1.1 200
3X-Application-Context: application
4Content-Type: text/plain;charset=UTF-8
5Content-Length: 12
6Date: Thu, 06 Oct 2016 04:28:14 GMT
7
8Hello World!

其他几种方式运行
  1. 前面提到过, 用 mvn package 生成一个 jar 包, 然后用 java -jar spring-boot-sample-1.0-SNAPSHOT.jar 一样能启动内嵌的 Tomcat
  2. 使用 spring-boot-maven-plugin 插件, 这是开发中最常见的方法, 可以说是 Spring Boot 的标配. 需要在 pom.xml 中添加
    1<build>
    2    <plugins>
    3        <plugin>
    4            <groupId>org.springframework.boot</groupId>
    5            <artifactId>spring-boot-maven-plugin</artifactId>
    6        </plugin>
    7    </plugins>
    8</build>

    之后便可以用 mvn spring-boot:run 来启动内嵌 Tomcat; 如果需要 Debug 方式启动 Tomcat, 
      mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
  3. 如果就是想要和从前一样生成一个 WAR 包部署到 Tomcat 里去行吗? 当然没问题, 只要在 pom.xml 中加上项目属性 <packaging>war</packaging>, 这时候再来 mvn package 生成的就是一个 WAR 包了.

上面我们是用 SpringApplication.run(SampleController.class, args) 启动了一个 Controller, 如果是要启动多个 Controller 该如何呢? 写上多个就行啦, 在这里
1 public static void mains(String[] args) throws Exception {
2     SpringApplication.run(new Object[]{SampleController.class, AnotherController.class}, args);
3 }

其他一些便利:
  1. 引入依赖 org.springframework.boot:spring-boot-starter-actuator 可以获得开箱即得的运维支持, 如 /beans 看到所有的 bean, /info 基本信息, 甚至 /shutdown 关闭应用. 可以启动控制台看到相关的路径映射.
  2. 约定的强大的外部化属性支持, 如从命令行参数, 系统属性; 约定位置外的 application.properties 或 application.yaml 文件中读取属性, 注入时只需 @Value("${name}")
  3. /static, /public, /resources 或 /META-INF/resources 目录只默认为静态文件
  4. 还出了 Spring Boot CLI, 在 Mac 下用  bew tap pivotal/tap; brew install springboot 安装, 命令为 spring

链接:

  1. 使用 Spring Boot 快速构建 Spring 框架应用
永久链接 https://yanbin.blog/try-spring-boot-spring-mvc/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。