什么是Spring Boot
学习过spring,并且做过项目的估计都经历过,xml文件的繁杂配置,让人眼花缭乱,且极易出错,因此 Spring 一度被称为“配置地狱”
为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是 Spring Boot。
Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。随着近些年来微服务技术的流行,Spring Boot 也成为了时下炙手可热的技术。
Spring Boot 提供了大量开箱即用(out-of-the-box)的依赖模块,例如 spring-boot-starter-redis、spring-boot-starter-data-mongodb 和 spring-boot-starter-data-elasticsearch 等。这些依赖模块为 Spring Boot 应用提供了大量的自动配置,使得 Spring Boot 应用只需要非常少量的配置甚至零配置,便可以运行起来,让开发人员从 Spring 的“配置地狱”中解放出来,有更多的精力专注于业务逻辑的开发。
Spring Boot 的特点
- 独立运行的 Spring 项目
Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。 - 内嵌 Servlet 容器
Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。 - 提供 starter 简化 Maven 配置
Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。 - 提供了大量的自动配置
Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。 - 自带应用监控
Spring Boot 可以对正在运行的项目提供监控。 - 无代码生成和 xml 配置
Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。
IDEA创建Spring Boot项目
1.使用maven
2.使用 Spring Initializr 创建
根据需要修改项目名称及项目存储位置等信息,最后点击 Finish 按钮,完成 Spring Boot 项目的创建
返回 IDEA 工作区,可以看到 Spring Boot 项目 helloworld 已经创建完成。该项目不但具有完整的目录结构,还有完整的 Maven 配置,并默认生成了一个名为 HelloworldApplication 的主启动程序。
此时,几乎所有的准备工作都已经准备就绪,我们可以在没有编写任何代码的情况下,直接将该 Spring Boot 项目运行起来。
启动 Spring Boot
默认情况下,Spring Boot 项目会创建一个名为 XXXApplication 的主程序启动类 ,该类中使用了一个组合注解 @SpringBootApplication,用来开启 Spring Boot 的自动配置,另外该启动类中包含一个 main() 方法,用来启动该项目。
直接运行启动类 HelloworldApplication 中的 main() 方法,便可以启动该项目
Spring Boot 项目 helloWorld 运行日志,wa
注意:Spring Boot 内部集成了 Tomcat,不需要人为手动配置 Tomcat,开发者只需要关注具体的业务逻辑即可。
新建一个controller,写入基本代码
打开浏览器,输入 http://localhost:8080/hello 访问,输入
Spring Boot starter
传统的 Spring 项目想要运行,不仅需要导入各种依赖,还要对各种 XML 配置文件进行配置,十分繁琐,但 Spring Boot 项目在创建完成后,即使不编写任何代码,不进行任何配置也能够直接运行,这都要归功于 Spring Boot 的 starter 机制
约定大于配置
Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器),starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则
并不是所有的 starter 都是由 Spring Boot 官方提供的,也有部分 starter 是第三方技术厂商提供的,例如 druid-spring-boot-starter 和 mybatis-spring-boot-starter 等等。当然也存在个别第三方技术,Spring Boot 官方没提供 starter,第三方技术厂商也没有提供 starter
以 spring-boot-starter-web 为例,它能够为提供 Web 开发场景所需要的几乎所有依赖,因此在使用 Spring Boot 开发 Web 项目时,只需要引入该 Starter 即可,而不需要额外导入 Web 服务器和其他的 Web 依赖。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.liu</groupId><artifactId>springboot_day2</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_day2</name><description>springboot_day2</description><packaging>jar</packaging><properties><java.version>1.8</java.version></properties><dependencies><!--导入 spring-boot-starter-web--><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>
在该项目命令行中执行以下 mvn 命令查看器依赖树。
[INFO] com.liu:ssmmodel:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.springframework:spring-core:jar:4.3.2.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- org.springframework:spring-context:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-jdbc:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-beans:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-expression:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-aspects:jar:4.3.2.RELEASE:compile
[INFO] | \- org.aspectj:aspectjweaver:jar:1.8.9:compile
[INFO] +- org.springframework:spring-tx:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:4.3.2.RELEASE:compile
[INFO] +- org.springframework:spring-webmvc:jar:4.3.2.RELEASE:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.2:provided
[INFO] +- jstl:jstl:jar:1.2:compile
[INFO] +- taglibs:standard:jar:1.1.2:compile
[INFO] +- org.mybatis:mybatis:jar:3.5.5:compile
[INFO] +- org.mybatis:mybatis-spring:jar:1.3.3:compile
[INFO] +- mysql:mysql-connector-java:jar:5.1.47:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.17.1:compile
[INFO] | \- org.apache.logging.log4j:log4j-api:jar:2.17.1:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.25:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] | \- log4j:log4j:jar:1.2.17:compile
[INFO] +- com.alibaba:fastjson:jar:1.2.62:compile
[INFO] +- com.alibaba:druid:jar:1.2.8:compile
[INFO] +- commons-fileupload:commons-fileupload:jar:1.4:compile
[INFO] | \- commons-io:commons-io:jar:2.2:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.6:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.9.6:compile
[INFO] +- io.jsonwebtoken:jjwt:jar:0.9.0:compile
[INFO] \- org.bitbucket.b_c:jose4j:jar:0.6.4:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.658 s
从以上结果中,我们可以看到 Spring Boot 导入了 springframework、logging、jackson 以及 Tomcat 等依赖,而这些正是我们在开发 Web 项目时所需要的。
您可能会发现一个问题,即在以上 pom.xml 的配置中,引入依赖 spring-boot-starter-web 时,并没有指明其版本(version),但在依赖树中,我们却看到所有的依赖都具有版本信息,那么这些版本信息是在哪里控制的呢?
其实,这些版本信息是由 spring-boot-starter-parent(版本仲裁中心) 统一控制的。
spring-boot-starter-parent
spring-boot-starter-parent 是所有 Spring Boot 项目的父级依赖,它被称为 Spring Boot 的版本仲裁中心,可以对项目内的部分常用依赖进行统一管理。
<!--SpringBoot父项目依赖管理-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/>
</parent>
Spring Boot 项目可以通过继承 spring-boot-starter-parent 来获得一些合理的默认配置,它主要提供了以下特性:
默认 JDK 版本(Java 8)
默认字符集(UTF-8)
依赖管理功能
资源过滤
默认插件配置
识别 application.properties 和 application.yml 类型的配置文件
查看 spring-boot-starter- parent 的底层代码,可以发现其有一个父级依赖 spring-boot-dependencies。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.5</version>
</parent>
spring-boot-dependencies 的底层代码如下。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><modelVersion>4.0.0</modelVersion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.5</version><packaging>pom</packaging>....<properties><activemq.version>5.16.1</activemq.version><antlr2.version>2.7.7</antlr2.version><appengine-sdk.version>1.9.88</appengine-sdk.version><artemis.version>2.15.0</artemis.version><aspectj.version>1.9.6</aspectj.version><assertj.version>3.18.1</assertj.version><atomikos.version>4.0.6</atomikos.version>....</properties><dependencyManagement><dependencies><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-amqp</artifactId><version>${activemq.version}</version></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-blueprint</artifactId><version>${activemq.version}</version></dependency>...</dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>build-helper-maven-plugin</artifactId><version>${build-helper-maven-plugin.version}</version></plugin><plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>${flyway.version}</version></plugin>...</plugins></pluginManagement></build>
</project>
以上配置中,部分元素说明如下:
dependencyManagement :负责管理依赖;
pluginManagement:负责管理插件;
properties:负责定义依赖或插件的版本号。
spring-boot-dependencies 通过 dependencyManagement 、pluginManagement 和 properties 等元素对一些常用技术框架的依赖或插件进行了统一版本管理,例如 Activemq、Spring、Tomcat 等。
YAML教程
Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置。
SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。
- application.properties
- application.yml
其中,application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。
YAML 简介
YAML 全称 YAML Ain’t Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件
想要使用 YAML 作为属性配置文件(以 .yml 或 .yaml 结尾),需要将 SnakeYAML 库添加到 classpath 下,Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。
下面是一个简单的 application.yml 属性配置文件。
server:port: 8081
YAML 语法
YAML 的语法:
- 使用缩进表示层级关系。
- 缩进时不允许使用 Tab 键,只允许使用空格。
- 缩进的空格数不重要,但同级元素必须左侧对齐。
- 大小写敏感。
实例:
spring:profiles: devdatasource:url: jdbc:mysql://127.0.01/banchengbang_springbootusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver
YAML 常用写法
对象:键值对的集合
数组:一组按次序排列的值
字面量:单个的、不可拆分的值
YAML 字面量写法
字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等
name: xiaoliu
YAML 对象写法
普通写法,使用缩进表示对象与属性的层级关系
user:name: xiaoliuage: 18
行内写法
user: {name: xiaoliu,age: 18}
记得键值对冒号后要有一个空格
YAML 数组写法
YAML 使用“-”表示数组中的元素,普通写法如下
arr:-xiao-da-kong
行内写法
arr: [xiao,da,kong]
YAWL复合结构
上面三种混合写
YAML 组织结构
一个 YAML 文件可以由一个或多个文档组成,文档之间使用“—”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“—”分隔符可以省略。
Spring Boot配置绑定
所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类)中
SpringBoot 提供了以下 2 种方式进行配置绑定:
使用 @ConfigurationProperties 注解
使用 @Value 注解
@ConfigurationProperties
1 在application.yml 中添加自定义属性
user:name: 小刘age: 16sex: 男bir: 2002/02/12lists: [小张,小刘]
2 创建 User 实体类,并将配置文件中的属性映射到这个实体类上
package com.liu.pojo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.List;/*** 将配置文件中配置的每一个属性的值,映射到这个组件中** @ConfigurationProperties:告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;* prefix = "person":配置文件中哪个下面的所有属性进行一一映射** 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;*/
@Component
@ConfigurationProperties(prefix = "user")
public class User {private String name;private int age;private String sex;private Date bir;private List<String> lists;public User(){}public User(String name, int age, String sex, Date bir, List<String> lists) {this.name = name;this.age = age;this.sex = sex;this.bir = bir;this.lists = lists;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBir() {return bir;}public void setBir(Date bir) {this.bir = bir;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +", bir=" + bir +", lists=" + lists +'}';}
}
注意:
- 只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Component 注解来添加组件到容器中。
- JavaBean 上使用了注解 @ConfigurationProperties(prefix = “person”) ,它表示将这个 JavaBean 中的所有属性与配置文件中以“person”为前缀的配置进行绑定。
修改controller
@Controller
public class UserController {@Autowiredprivate User user;@ResponseBody@RequestMapping("/hello")public String Hello(){return "Hello Spring Boot !";}@ResponseBody@RequestMapping("/user")public User user(){return user;}
}
重启项目,使用浏览器访问 http://localhost:8080/user
Spring Boot 读取自定义配置
@Value
当我们只需要读取配置文件中的某一个配置时,可以通过 @Value 注解获取。
user.properties
user.name=小刘
user.age=14
user.sex=女
user.bir=2002/12/12
user.lists=a,b,c
在 user 使用 @PropertySource 注解指向 user.properties
重新启动项目,访问