SpringBoot 开发概要
SpringBoot 是 Spring 官方当前力推的开发框架,它以合理的默认值,开发者以极少的配置即可快捷地搭建应用,足以让传统的 Spring 开发者拍案叫绝!本文简述了 SpringBoot 的原理和作用,并以实例演示常见 WEB 项目的构建方法,其中包括数据库和 Redis 的接入方法。
作者:王克锋
出处:https://kefeng.wang/2017/12/16/spring-boot/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。
1.概述
1.1 作用
Spring Boot 是 Pivotal 团队开发的全新框架,用来简化 Spring 应用的创建和开发过程。
它最小化 Spring 的前期配置,使各组件拥有合理的默认值,开发者只需极少的个性化配置调整,就能满足实际需要。
对于Spring Boot Web 应用程序,默认情况下它使用了一个嵌入式 Tomcat 容器,它既可以独立运行(java -jar 形式),也可以在 J2EE 服务器中运行。
Spring Boot 首版(1.0.0)发布于 2014年4月,当前最新版本为 1.5.9(2017年11月)。
1.2 可替代的传统功能
- 配置 web.xml,加载spring和spring mvc
- 配置数据库连接、配置spring事务
- 配置加载配置文件的读取,开启注解
- 配置日志文件
- …
- 打成 war 包,部署于 Tomcat 运行。
1.3 常用的 starter
每样功能被封装为 starter 形式,而且允许开发者自己开发 starter 再使用。
Spring Boot Starters
Spring Boot:定制自己的starter
- spring-boot-starter: Core starter, including auto-configuration support, logging and YAML
spring-boot-starter-parent: 提供了有用的 Maven 默认设置
spring-boot-starter-aop: Starter for aspect-oriented programming with Spring AOP and AspectJ
- spring-boot-starter-mail: Starter for using Java Mail and Spring Framework’s email sending support
- spring-boot-starter-security: Starter for using Spring Security
spring-boot-starter-test: Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito
spring-boot-starter-logging: Starter for logging using Logback(DEFAULT).
spring-boot-starter-log4j2: Starter for using Log4j2 for logging.
spring-boot-starter-jdbc: Starter for using JDBC with the Tomcat JDBC connection pool
- spring-boot-starter-activemq: Starter for JMS messaging using Apache ActiveMQ
spring-boot-starter-data-redis: Starter for using Redis key-value data store with Spring Data Redis and the Jedis client
spring-boot-starter-web: Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container
- spring-boot-starter-velocity: 对Velocity模板引擎的支持(velocity已废弃)
- spring-boot-starter-freemarker: 对FreeMarker模板引擎的支持
- spring-boot-starter-websocket: Starter for building WebSocket applications using Spring Framework’s WebSocket support
- spring-boot-starter-web-services: Starter for using Spring Web Services
- spring-boot-starter-tomcat: Starter for using Tomcat as the embedded servlet container(DEFAULT used by spring-boot-starter-web).
- spring-boot-starter-jetty: Starter for using Jetty as the embedded servlet container.
- spring-boot-starter-actuator: 添加生产准备特性,比如指标和监控
2.创建工程
2.1 各种创建方法
- https://start.spring.io/: 在线创建、下载、导入;
- Spring Boot CLI: 命令行方式;
- Spring Tool Suite(Eclipse): 创建 Spring Starter Project;
- IntelliJ IDEA: 推荐使用,创建 “Spring Initializr” 项目:
2.2 IntelliJ IDEA 创建工程(hellospring)
- 启用 Spring Boot: 进入菜单 File / Settings, Plugins, 对 “Spring Boot” 打勾(默认没打勾,如果找不到该插件则要先安装),重启 IDEA;
- 创建工程: 进入菜单 File / New / Module, Spring Initializr, 保持默认的 https://start.spring.io 点下一步;
- 修改相关参数,如 Group / Artifact(要求全小写字母) / Java Version(7,8,9) 等,下一步;
- 选择 Spring Boot 版本(默认为稳定版的最高版本),并按分类勾选要引入的 starter;如 Web/Web, SQL/JDBC|MySQL|MyBatis, NoSQL/Redis, IO/Mail|Kafka, Ops/Actuator
- 指定名称和路径,完成。
2.3 基本 pom.xml
1 | <parent> |
2.4 配置文件
全局配置文件 application.properties(可移入 resource/config 目录) 用来修改默认配置:
所有配置参数列表:Common application properties
常用配置参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19debug=false ## 显示调试信息(出错时有用)、自动配置报告
server.port=8080 ## HTTP 服务监听端口(默认为8080)
### HTTPS
# server.port = 8443
# server.ssl.key-store = classpath:keystore.jks
# server.ssl.key-store-password = secret
# server.ssl.key-password = another-secret
### 响应体的压缩
server.tomcat.compression=on
server.tomcat.compressableMimeTypes=application/json
# 默认使用 logback 为日志框架,这是推荐的方式
spring.main.banner-mode=off
logging.file=webapp.log
logging.level.org.springframework=INFO
logging.pattern.console=%d{HH:mm:ss.SSS} %p [%F:%L] - %m%n
logging.pattern.file=%d{HH:mm:ss.SSS} %p [%F:%L] - %m%n
如果有开发(dev)和线上(prod)两套环境,大部分配置相同,可以采用 profile 机制,
在 application.properties 或命令行中指定环境: spring.profiles.active = dev | prod
- application.properties: 通用配置
- application-dev.properties: 开发环境专用配置
- application-prod.properties: 线上环境专用配置
2.5 应用类 HellospringApplication.java
@SpringBootApplication
是核心注解,它包含以下几个注解:
@EnableAutoConfiguration
: 根据类路径中的 jar 包依赖为当前项目进行自动配置。@SpringBootConfiguration
: 等价于 @Configuration,说明这是一个JavaConfig@ComponentScan
: 启用注解自动扫描
1 |
|
2.6 添加控制类 HellospringController.java
1 | // 指定数据格式为 JSON(Apache Jackson) |
2.7 添加单元测试 HellospringApplicationTests.java
代码添加后,直接运行 HellospringApplicationTests.java 会模拟 HTTP 请求,
运行完毕后会报告测试用例通过,或每个失败信息。
1 | (SpringJUnit4ClassRunner.class) |
2.8 启动
IDE 中无需配置 Tomcat Server,直接运行应用类的 main() 函数即可。
也可以构建后在命令行运行: java -jar target/hellospring-0.0.1-SNAPSHOT.jar
2.9 浏览
http://localhost:8080/hello
如此简单,所以 Sping Boot 非常适合构建微服务。
它整合了 Spring 框架,并集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等),
这些第三方库几乎可以零配置的开箱即用,只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
3.Spring Boot 内部机制
在Maven依赖中引入了spring-boot-starter-web,它包含了Spring Boot预定义的一些Web开发的常用依赖:
- spring-web, spring-webmvc Spring WebMvc框架
- tomcat-embed-* 内嵌Tomcat容器
- jackson 处理json数据
- spring-* Spring框架
- spring-boot-autoconfigure: Spring Boot提供的自动配置功能
在SpringApplication.run()方法执行后,Spring Boot的autoconfigure发现这是一个Web应用(根据类路径上的依赖确定),于是在内嵌的Tomcat容器中启动了一个Spring的应用上下文,并且监听默认的tcp端口8080(默认约定)。同时在Spring Context中根据默认的约定配置了Spring WebMvc:
- Servlet容器默认的Context路径是/
- DispatherServlet匹配的路径(servlet-mapping中的url-patterns)是/*
- @ComponentScan路径被默认设置为SampleController的同名package,也就是该package下的所有@Controller,@Service, @Component, @Repository都会被实例化后并加入Spring Context中。
没有一行配置代码、也没有web.xml。基于Spring Boot的应用在大多数情况下都不需要我们去显式地声明各类配置,而是将最常用的默认配置作为约定,在不声明的情况下也能适应大多数的开发场景。
4.接入数据库
4.1 配置数据库
application.properties1
2
3
4spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/site?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=site
spring.datasource.password=MySQL5.7
4.2 JdbcTemplate 方式
4.2.1 pom.xml
1 | <dependency> |
4.2.2 HellospringController.java
1 | // 指定数据格式为 JSON(Apache Jackson) |
4.3 Mybatis 方式
4.3.1 配置 MyBatis
application.properties1
mybatis.mapperLocations=classpath:mapper/*.xml
4.3.2 配置 starter(pom.xml)
1 | <dependency> |
4.3.3 生成 MyBatis 相关文件
借助 MyBatis Generator,生成下列文件:
java: entity/MainUsers[Example].java
java: mapper/MainUsersMapper.java
resources: mapper/MainUsersMapper.xml
如果是从其他工程复制过来,注意调整 MainUsersMapper.xml 中的包名。
4.3.4 添加存储类 MainUsersRepository.java
repository/MainUsersRepository.java1
2
3
4
5
6
7
8
9
public class MainUsersRepository {
private MainUsersMapper mapper;
public List<MainUsers> getUsers() {
return mapper.selectByExample(null);
}
}
4.3.5 调整控制类 HellospringController.java
1 | // 指定数据格式为 JSON(Apache Jackson) |
4.3.6 调整应用类 HellospringApplication.java
1 | // 当 mapper.java 与 Application.java 不同目录时,必须指定 mapper.java 所在包 |
5.接入 Redis
5.1 pom.xml
1 | <dependency> |
5.2 application.properties
1 | ### Redis |
5.3 HellospringController.java
其中的 StringRedisTemplate
相当于 spring-data-redis 中的 RedisTemplate<String, String>
。1
2
3
4
5
6
7
8
9
10
11
12
13// 指定数据格式为 JSON(Apache Jackson)
public class HellospringController {
private StringRedisTemplate stringTemplate;
"/hello") (
public String hello() {
String name = "test:time";
String value = Long.toString(System.currentTimeMillis());
stringTemplate.opsForValue().set(name, value);
return stringTemplate.opsForValue().get(name);
}
}
6.高级用法
6.1 使用 Jetty 代替 Tomcat
调整 pom.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
6.2 部署到云端
大多 PaaS 云提供商(Heroku/Cloud Foundry)要求你带上自己的容器,它们管理应用的进程(不特别针对Java应用程序)。
理想情况下,你的应用就像一个Spring Boot可执行jar,所有运行需要的东西都打包到它内部。
Heroku为Java应用分配一个端口,确保能够路由到外部URI。