对于 Spring 框架,我们接触得比较多的应该是 Springmvc 和 spring。而 spring 的核心在于 IOC(控制反转)和 DI (依赖注入)。而这些框架在使用的过程中会需要配置大量 的xml,或者需要做很多繁琐的配置。 SpringBoot 框架是为了能够帮助使用 spring 框架的开发者快速高效的构建一个基于 spring 框架以及 spring 生态体系的应用解决方案。
SpringBoot 是对“约定优于配置”这个理念下的一个最佳实践。因此它是一个服务于框架的框架,服务的范围是简化配置文件。 约定优于配置的体现主要是:
- maven的目录结构 a) 默认有resources文件夹存放配置文件 b) 默认打包方式为jar
- spring-boot-starter-web 中默认包含 spring mvc 相关 依赖以及内置的tomcat容器,使得构建一个web应用更加简单
- 默认提供application.properties/yml文件
- 默认通过 spring.profiles.active 属性来决定运行环境时 读取的配置文件
- EnableAutoConfiguration 默认对于依赖的starter进行 自动装载
记住一句话:推出springboot的初衷就是为了简化spring的配置,使得开发中集成新功能时更快,简化或减少相关的配置。
SpringBoot 核心特点:
- 自动配置(auto-configuration)。一项简化配置的功能,比如在classpath中发现有spring security的jar包,则自动创建相关的bean等
- starters(简化依赖)。这个比较关键,方便spring去集成各类组件,比如redis、mongodb等等。
你可以使用Spring Boot创建Java应用,并使用 java -jar 启动它或采用传统的war部署方式。所以,下面我们就来看看如何创建SpringBoot项目把!
1.两种构建方式
在IDE中创建SpringBoot项目有两种常用方式:
- 一种是创建普通maven项目,然后SpringBoot相关依赖,并创建SpringBoot的项目结构
- 一种是通过IDE自带的 Spring Initializr 快速搭建
1.1 maven搭建
第一步:引入 SpringBoot 相关依赖,pom文件如下:
<!-- 父工程依赖(核心,必须有) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.8.RELEASE</version>
</parent>
<!-- 依赖引入相应starter即可 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 引入一个spring boot插件,可以支持我们将web应用程序打成可运行jar包(必须有) -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
另外,spring-boot-starter-parent 虽然方便,但是在公司中开发微服务项目或者多模块项目时一般需要使用公司自己的parent,这个时候如果还想进行项目依赖版本的统一管理,就需要使用 dependencyManagement 来实现了。添加如下代码到 pom.xml 文件中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
第二步:创建目录结构
我们需要在maven的基础上,在java的根目录下新建启动类,在resource下新建配置文件 application.properties(或yml)、static目录、template目录:
几点注意:
- 启动类:必须放在所有包的外面,因为启动类会默认扫描它所在目录的bean
- static:一般放静态资源文件(html,css,js),可有直接被访问
- template:一般放需要模板引擎的(jsp,thymeleaf),需要经过 Controller 转发后才能访问
- 配置文件:application.yml(properites), logback.xml等能自动检测到
第三步:编写创建启动类
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
1.2 Spring Initializr
如果直接通过 IDE 自带的 Spring Initializr 去创建 SpringBoot 项目,那么非常简单,可以说是一步到位。
好了,现在 SpringBoot 项目搭好了,不是前面说 SpringBoot 能实现自动配置吗,那我就不用配置喽?nonono… 自动配置的主要意思是我们不需要像使用 Spring 那样在 xml 中写那么多关于 bean 的配置,但是一些关键信息比如说我数据库的IP账号密码,我们总不能让框架都给你提前设置好把。所以接下来我们就来看看有哪些常见的基本配置。
注:像什么服务启动端口、数据库端口,字符编码等即使你不配置也是有默认值的
2.基本配置项
web常用配置项 | 默认值 | 说明 |
debug | false | 开启/关闭调试模式 |
server.port | 8080 | 服务器端口 |
server.servlet.context-path | / | 应用上下文,即请求统一前缀(比如/api) |
spring.http.encoding.charset | utf-8 | 默认字符集编码 |
spring.thymeleaf.cache | true | 开启/关闭页面缓存 |
spring.mvc.date-format | 日期输入格式 | |
spring.jackson.date-format | json输出日期格式 | |
spring jackson.time-zone | 设置GMT时区 |
除了上表列出的之外,还有下面几个常用的配置项
2.1 不同环境配置
server:
port: 8081
servlet:
context-path: /api
spring:
profiles:
active: dev # 指定dev为当前环境
--- # --- 下表示一种情况
spring:
profiles: dev # 当前配置名(开发环境,dev)
server:
port: 8082
--- # 生产环境,prod
spring:
profiles: prod
server:
port: 8083
2.2 日期相关
即传入和返回的Date类型进行格式化
# 传入时间转换(mydate)
spring.mvc.date-format=yyyy-mm-dd
# 返回时间转换
spring.jacksonn.date-format=yyyy-mm-dd
# 设置时区,必须!!
spring.jackson.time-zone=GMT+8
注:也可以在相应entity加@dateFormat注解等,各有利弊
2.3 日志相关
# 指定log文件位置(一般为绝对路径)
logging.file.name=C:\\Users\\Desktop\\demo.log
# 设置打印的日志级别
# 1.root表示所有包
logging.level.root=INFO
# 2.指定包
logging.level.springframework=ERROR
logging.level.dao=DEBUG
2.4 banner
- Banner是指SpringBoot启动时显示的字符画,默认是“spring”。
- 我们可以新建resources/banner.txt进行修改。
关闭banner:
// 注释掉 SpringApplication.run(DemoApplication.class, args);
SpringApplication app = new SpringApplication(DemoApplication.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
3.两种打包方式
SpringBoot 项目既可以打成 jar 包,也可以打成 war 包。我们以前使用 ssm 框架时都是先把项目写好,然后打成 war 包丢到 tomcat 里面,而 SpringBoot 集成了内嵌 tomcat,所以我们可以打成 jar 包运行。
3.1 打 jar 包
1.自行指定jar包名
<build>
<!-- 指定打包的文件名称 -->
<finalName>Springboot-Jar</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.若出现工程中出现多个mainclass的时候需要指定主启动类
<build>
<finalName>SpringBoot-Jar</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 指定主启动类 -->
<configuration>
<mainClass>com.xupt.yzh.demo.DemoApplication</mainClass>
</configuration>
<goals>
<goal>repackage</goal>
</goals>
</plugin>
</plugins>
</build>
3.2 打war包
1.指定springboot pom中的打包方式 由jar改为war
2.在spring-boot-starter-web模块中找到 spring-boot-starter-tomcat 然后修改scope为provided
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.4.0</version>
<!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,
运行等周期。相当于compile,但是打包阶段做了exclude操作-->
<scope>provided</scope>
</dependency>
3.主启动类上继承 SpringBootServletInitializer 重写 confiure 方法
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
}