2018-10-30 · Develop

快速创建一个SpringBoot应用

是时候开始学习 SpringBoot 了。

Spring Boot 是什么

Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用, Spring Boot 管理 Spring 容器、第三方插件,并提供很多默认系统级的服务。
SpringBoot 是在 Spring 框架基础上创建的一个全新的框架,其设计目的是简化 Spring 应用的搭建和开发过程,它不但具有 Spring 的所有优秀特性,而且具有如下显著的特点:

spring-boot

Spring Boot Starter

Spring Boot 通过 Starter 来提供系统级服务, Spring Boot 已经提供了一些列 Starter,当然你也可以开发自己的 Starter 。

名称 作用
spring-boot-starter-web Web 开发支持,默认使用 Tomcat8
spring-boot-starter-aop AOP 开发支持,使用 AspectJ
spring-boot-starter-jdbc Spring JDBC
spring-boot-starter-data-jpa JPA 方式访问数据库,使用Hibernate 作为JPA 实现
spring-boot-starter-data-elasticsearch 集成E lasticsearch ,默认访问localhost:9200
spring-boot-starter-data-redis 集成Red is ,使用JRedis ,默认连接localhost:6379
spring-boot-starter-cache 缓存, 支持多种缓存方式,如本地的、Redis 、Ehcache 等
spring-boot-devtools 应用程序快速重启的工具,提升开发体验
spring-boot-starter-data-mongodb 集成MongoDB ,默认访问mongo db://localhosνtest
spring-boot-starter-data-neo4j 集成neo4j , 默认访问localhost:7474
spring-boot-starter-data-gemfire 集成分布式缓存
spring-boot-starter-data-solr 基于Apache lucene 的搜索平台,默认访问http://localhost:8983/solr
spring-boot-starter-data-cassandra 集成Cassandra,默认访问localhost:7474
spring-boot-starter-data-ldap 集成ldap
spring-boot-starter-activemq 消息集成ActiveMQ 支持
spring-boot-starter-amqp 消息集成AMQP 协议支持,如支持RabbitMQ
spring-boot-starter-jta-atomikos 分布式事务支持,使用atomikos
spring-boot-starter-jta-bitronix 一个开源的分布式事务支持
spring-boot-starter-test 包含JUnit 、Spring Test、Hamcrest 、Mockito 等测试工具
spring-boot-starter-webservices webservice 支持
spring-boot-starter-websocket websocket 支持
spring-boot-starter-jersey REST 应用和Jersey 支持
spring-boot-starter-freemarker Freemaker 支持

Hello,Spring Boot

开始搭建一个简单的 Spring Boot 的 Web 应用,输出 "Hello,Spring Boot!"。

在开始之前,参考 Guide 知道创建一个 Spring Boot 应用需要:

添加 Web 支持

Spring Boot 只需在 pom.xml 中添加一个 spring-boot-starter-web 的依赖,其会内置 Tomcat 作为 web 容器,并且自动配置好 Spring 应用需要的一切配置。

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

	<groupId>com.zuojl</groupId>
	<artifactId>spring-boot-hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.5.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

添加 Application

准备好 pom 后,接下来创建 main 函数,位于 HelloApplication.java

package com.example.hello;

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

@SpringBootApplication
public class HelloApplication {

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

添加 Controller 以供浏览器访问应用。

package com.example.hello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @RequestMapping("/")
    @ResponseBody
    public String say() {
        return "Hello, Spring Boot!";
    }
}

注意:

对于 Spring Boot 应用,建议启动启动程序的包名层次最高,其他类均在其下,这样 Spring Boot 默认自动搜素启动程序之下的所有类。

部署验证

此时的项目目录结构如下:

.
+--- pom.xml
+--- src
|   +--- main
|   |   +--- java
|   |   |   +--- com
|   |   |   |   +--- zuojl
|   |   |   |   |   +--- hello
|   |   |   |   |   |   +--- controller
|   |   |   |   |   |   |   +--- HelloController.java
|   |   |   |   |   |   +--- HelloApplication.java
|   |   +--- resources
|   |   |   +--- application.yml
+--- target
|   +--- classes
|   |   +--- application.yml
|   |   +--- com
|   |   |   +--- zuojl
|   |   |   |   +--- hello
|   |   |   |   |   +--- controller
|   |   |   |   |   |   +--- HelloController.class
|   |   |   |   |   +--- HelloApplication.class
|   +--- generated-sources
|   |   +--- annotations
|   +--- generated-test-sources
|   |   +--- test-annotations

启动项目,打开浏览器访问 http://localhost:8080/ ,可以看到输出 "Hello, Spring Boot!" 。

使用热部署

在开发阶段经常需要修改类等操作,如果频繁的重启应用,是相当不方便的。 Spring Boot 提供了在修改类或者配置文件的时候自动重新加载的 Starter ,只需要添加如下依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency>

查看日志信息:

...
2018-10-02 13:56:07.265  INFO 17980 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2018-10-02 13:56:07.279  INFO 17980 --- [  restartedMain] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-10-02 13:56:07.290  INFO 17980 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-02 13:56:07.291  INFO 17980 --- [  restartedMain] com.example.hello.HelloApplication       : Started HelloApplication in 0.647 seconds (JVM running for 17.133)
2018-10-02 13:56:07.294  INFO 17980 --- [  restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged

上面的 LiveReload server 用于监控 Spring Boot 应用文件的变化。所以就可以支持热部署了。

注意:
对于 Intellij IDEA 编辑器有可能出现不自动部署的情况,需要做如下的处理:

idea-auto-build

idea-registry

idea-auto-build-running

添加对 REST 的支持

对于多系统互相访问的情况,最好不要直接访问对方的数据库,而应该采用类似 RESTFul 架构,封装接口的方式, RESTFul 只是一种架构风格,并不是一种特别的技术体系。 将 HelloController.java 做如下调整就可实现 RESTTFul 。

package com.example.hello.controller;

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

@RestController
public class HelloController {

    @RequestMapping("/")
    public String say() {
        return "Hello, Spring Boot!";
    }
}