本文环境基于
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 | # 项目根目录 |