本文环境基于
springboot 2.0.1.RELEASE, springboot 要求JDK8+。
认识 SpringBoot
Spring Boot : 与 Spring4 一起诞生,是一个微框架。
- 整合了许多子项目,使用很少的配置就可以十分快速的搭建和运行项目。约定优先于配置,减少样板化的配置。
- 自动装配:springMVC,jdbc,事务等。
- 使用嵌入式容器:tomcat,netty,jetty等。不需要打成 war 包,就可以放入 tomcat 中运行。
- 提供可视化的相关功能,方便监测,比如性能,应用的健康程度等。
- 为微服务 SpringCloud 铺路,SpringBoot 可以整合很多框架来构建微服务,比如 dubbo,thrift 等。
| 相关比较 | 说明 |
|---|---|
spring framework |
spring 框架。 |
spring boot |
快速构建 spring 应用。 |
spring cloud |
springboot 分布式云应用。 |
快速起步
SpringBoot 提供了一个快速初始化项目的网站 https://start.spring.io 。
当然我们也可以构建一个普通的 Maven 项目并引入相关依赖。
springboot 项目需要继承 spring-boot-starter-parent ,其会提供一些默认参数。
1 | <parent> |
快速构建 web 项目,只要引入 spring-boot-starter-web 即可,其已包含了 tomcat 插件。正如所见,其会继承父 pom 的版本号。
1 | <dependency> |
springboot 使用 main方法 启动,其会自动扫描包内的相关配置等。
注意 : 如下的示例,只会扫描
tk.gushizone.demo及其子包的内容。
1 | package tk.gushizone.demo; |
仅需以上的配置,即可启动运行一个简单的 Web 项目,就是这么简单!
例如添加如下 Rest 风格的 Controller,进行测试。
1 | package tk.gushizone.demo.controller; |
目录结构
一个简单的 springboot 的目录如下所示。
1 | demo |
配置文件
springboot 默认支持通过 application.properties 和 application.yml 配置属性。两者可以并存,且会优先参考 .properties ,若相关配置没有,会尝试从 .yml 中获取。
1 | # api 端口号 |
yaml 是当前流行的配置方式,较 .properties 展示树状结构更清晰,较 .xml 更加简洁。
下文中为使配置项更清晰,会以
.properties的方式配置。
1 | server: |
环境隔离
一般开发 ,测试,上线等环境是不同的,springboot 支持多环境的文件配置。可以创建 application-{profile}.properties 或 application-{profile}.yml 等配置文件,使用 spring.profiles.active 指定当前生效的配置文件。
1 | spring.profiles.active: dev |
使用 yml 配置时,也可以配置在一个文件中配置。 不推荐 !
1 | spring: |
读取配置
可以在 .yml 中直接使用已定义的值。
1 | default: |
在 Java 中获取值,并设置默认值。
1 | import org.springframework.beans.factory.annotation.Value; |
读取自定义文件
一般我们会将配置文件放在 resource 目录,默认编译行为会将其输出到更目录,通过 ClassLoader 可以获取 classpath 根目录路径。
注意 : 文件的读取是依赖当前环境的目录结构,并不是项目目录结构。例如 编译和打包后,目录结构都是不同的。
1 | String fileName = "mmall.properties"; |
1 | // 方式一,推荐 |
1 | // 属性文件读取 |
整合 Log
springboot 整合了一个 sl4j 依赖,可以直接使用 log4j 和 logback 。当然也可以单独引入。
1 | <dependency> |
推荐使用 Logback。
- Log4j具体配置参考 : 浅谈LOG之Log4j
- Logback具体配置参考 : 浅谈LOG之Logback
整合Thymeleaf
完成如下配置即可使用 Thymeleaf,详情参考 :
pom.xml
Spring Boot 1.x中包含了thymeleaf-layout-dialect,但在Spring Boot 2.x中被移除。
1 | <!-- thymeleaf 和 布局方言 --> |
application.properties
1 | spring.thymeleaf.prefix=classpath:/templates/ |
messages*.properties
顺便提一下国际化配置,文件默认必须以 messages 开头命名,可以重写 MessageSourceAutoConfiguration 。
/src/main/resources/i18n/messages_zh_CN.properties
1 | home.welcome=欢迎来到我们的杂货店! |
整合 Mybatis
pom.xml
1 | <!-- mybatis --> |
1 | <!-- DB --> |
一般 *Mapper.xml 会放在 resources 下,但是这样开发和管理时不是很方便。这时可以放在 java 目录内,添加以下配置,可以确保被复制到输出目录。
1 | <build> |
application.properties
没有扫描的xml并不影响启动,但使用时会出现
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)异常 。
1 | # mybatis |
1 | # db |
1 | # 热部署 - mybatis相关 ( 需要配置devtools ) |
Application.java
@MapperScan用于扫描 DAO层 接口,生成对应的 bean。
1 | package tk.gushizone.mybatis; |
热更新
热部署 和 热加载 都是指不重启服务,完成更新编译/部署项目,其都是基于Java的类加载器实现。
| 涉及 | 部署方式 | 实现原理 | 使用场景 |
|---|---|---|---|
| 热部署 | 热部署在服务器运行时重新部署项目 | 热部署直接重新加载整个应用,存在内存释放。 | 热部署更多在生产环境使用。 |
| 热加载 | 热加载在运行时重新加载class | 热加载在运行时重新加载class,监控文件是否改变,直接修改 JVM 内的字节码文件。 | 热加载更多在开发环境使用。 |
可以看出我们一般说的热部署其实都是热加载,这里也是介绍一下springboot热加载方式。
| 热加载方式 | 说明 |
|---|---|
| - | 默认情况下springboot可以完成对 .java 的热更新,至少在 IDE 中是这样 🤣 。 |
| Devtools | 使用快速重启的方式,可以完成对 .java 和 .xml 的热更新。 |
| Springloaded | 可以完成对 .java 的热更新。 |
| IDE 插件 | 如 JRebel ,收费插件,这里不会介绍。 |
-
Eclipse
eclipse 默认会自动编译,不需要任何设置,即可完成热更新。
IDEA
IDEA 默认不会自动编译,需要设置。
Preferences->Build,Execution,Deployment->Compiler->Build project automaticaly。command + shift + ctrl + /->Registry->compiler.automake.allow.when.app.running。- 编辑应用启动配置:
Edit Configuration->Running Application Update Policies->Update classes and resources。
如果还是不行,可以点击右上角的小锤子,或
command + F9。
Devtools
Devtools在项目较大时,启动依然会慢 🤣。
实现对类文件的热部署,文件发生改变时会立即重启应用,因为采用虚拟机机制,重启会很快。
pom.xml
1 | <!-- devtools --> |
application.properties
1 | # 热部署 - thymeleaf |
Springloaded
在 spring-boot-maven-plugin 插件下添加 springloaded 依赖。
如果不能自动下载,先放到上面的
dependencies中即可下载。
1 | <build> |
maven方式
IDEA 中直接
Terminal进行clean install再mvn spring-boot:run即可。
1 | # 项目根目录 |
JVM 启动参数
需要下载 jar 包,记住路径,并给 JVM 添加启动参数。
1 | -javaagent:/users/username/developer/lib/springloaded-1.2.6.RELEASE.jar -noverify |
Junit
1 | <dependency> |
Junit 的测试方法一定要是 public 。
1 | package org.demo.test; |
打包 & 运行
这里仅介绍 jar 和 war 的打包和运行。
打包种类
在应用启动模块 的 pom 规定打包方式 , 其默认为 jar 。
注意 :当设置为war时,需要满足含有main/webapp/WEB-INF/web.xml,即使为空文件。
1 | <packaging>war</packaging> |
一般的打包种类有 : jar , war , ear ,详情如下:
| 打包方式 | 说明 |
|---|---|
jar |
Java Archive file ,一般把开发时要引用通用(JAVA)类及资源做封装,打成包后便于存放管理。 |
war |
Web Archive file ,一个(web)完整的应用,通常是网站或WEB平台,打成包后可以部署到容器中。 |
ear |
Enterprise Archive file ,企业级应用,实际上EAR包中包含WAR包和几个企业级项目的配置文件而已,服务器中间件通常选择WebSphere等都会使用EAR包。通常是EJB打成ear包。 |
编译插件和启动类
springboot 提供了编译打包的maven插件,如果希望可以直接运行,还需要指定启动类: mainClass 。
方式一
1 | <build> |
方式二
1 | <properties> |
打包并运行
进入项目根目录,执行以下命令:
1 | # 跳过测试,更新第三方包,clean,package |
打包成功后,可以在 主模块 /web/target 下看到压缩包。
1 | # 打包为 jar 时: |
jar方式,启动项目
1 | # 打包为 jar 时: |
maven 方式运行
1 | # 项目根目录 |