目录
一、Spring Boot简介
Spring Boot 是 Spring 框架的一个扩展,旨在简化 Spring 应用的初始搭建和开发过程。它通过自动配置和约定优于配置的原则,提供一个开箱即用的应用程序架构,能够快速构建独立运行的 Spring 应用,开发者基于 Spring Boot 的预置结构继续开发,省时省力。
Spring Boot 官方文档:https://docs.spring.io/spring-boot/index.html
Spring 中文网翻译的 Spring Boot 中文文档:https://springdoc.cn/spring-boot
通过 IDEA 创建 Spring Boot 项目:
添加核心依赖 Spring Web:
除了用 IDEA 创建 Spring Boot 项目,也可以直接访问 Spring Boot 项目生成网站,设定项目的元数据(如项目类型、语言、Spring Boot 版本等)之后,创建好的项目就会以压缩包的格式下载到本地,解压导入到开发工具即可。
Spring Boot 项目生成网站:
- https://start.spring.io/:Spring Boot 官方的项目生成工具,Java 版本和 Spring Boot 版本都比较新,国内有可能访问不了或访问速度比较慢
- https://start.springboot.io/:官方项目生成工具的国内镜像,Java 版本和 Spring Boot 版本与官网一致,国内都能访问
- https://start.aliyun.com/:从域名能看出来是阿里云镜像,国内都能访问,而且能用旧的 Java 版本和 Spring Boot 版本生成项目
一个典型的 Spring Boot 项目结构如下:
SpringBoot-project/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── MyApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── static/
│ │ └── templates/
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── MyApplicationTests.java
├── pom.xml
└── README.md
- MyApplication.java:Spring Boot 应用的主类,使用
@SpringBootApplication
注解标记。 - application.properties:Spring Boot 应用的配置文件,可以配置各种属性。
- static/:存放静态资源文件,例如 HTML、CSS、JavaScript 文件等。
- templates/:存放模板文件,例如 Thymeleaf、Freemarker 等。
二、Spring Boot的主要特性
2.1、自动配置
开发者无需手动配置大量 XML 或注解,Spring Boot 能够根据项目中添加的依赖,自动为应用程序生成合理的默认配置,减少手动配置。例如,在项目中添加了 spring-boot-starter-web
依赖,Spring Boot 会自动配置嵌入式的 Tomcat 服务器,并为 Spring MVC 设置好必要的组件,如 DispatcherServlet
等,无需开发者手动编写大量的配置代码。
2.2、起步依赖(Starters)
起步依赖是指对常用库和框架的依赖声明的集合,使用起步依赖可以一次性地添加相关的依赖和配置到项目中,大大简化了项目的依赖管理,减少因依赖冲突而导致的问题。
比如,spring-boot-starter-data-jpa
包含了使用 Spring Data JPA 进行数据库操作所需的所有依赖,包括 Hibernate、Spring Data JPA 和数据库连接池等。
2.3、简化配置
Spring Boot 使用 application.properties
或 application.yml
作为统一的配置文件,将应用程序的各种配置集中管理,并且提供默认配置,尽量减少开发者的手动配置。这些配置文件放置在项目的类路径下,Spring Boot 会自动加载并应用其中的配置。
并且 Spring Boot 支持多环境配置,允许开发者根据不同的运行环境(如开发、测试、生产)使用不同的配置文件。通过在配置文件名中使用 {profile}
占位符,如 application-dev.yml
、application-prod.yml
,并在 application.yml
中指定 spring.profiles.active
属性来激活相应的环境配置。
2.4、内置服务器
Spring Boot 支持嵌入式的服务器,如 Tomcat、Jetty 和 Undertow 等,开发者可以将应用程序打包成一个可执行的 JAR 文件,使用 java -jar
命令可启动服务,无需单独部署到外部的应用服务器上。
例如,在开发 Web 应用时,只需在 pom.xml
文件中添加 spring-boot-starter-web
依赖,Spring Boot 会自动配置并启动一个嵌入式的 Tomcat 服务器,让开发者可以快速进行开发和测试。
2.5、无代码生成与 XML 配置
Spring Boot 无需代码生成和 XML 配置,完全基于注解和 Java 配置。
三、Spring Boot的配置
3.1、配置文件类型
Spring Boot 支持两种主要的配置文件类型:application.properties 和 application.yaml(.yml)。
3.1.1、application.properties
这是传统的 Java 配置文件格式,每行定义一个属性,采用 key=value
的形式。例如:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/spring_db
spring.datasource.username=root
spring.datasource.password=password
3.1.2、application.yaml(或.yml)
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,它的特点包括:
- 使用缩进(空格数不限)表示层级关系(必须用空格缩进,不能使用 Tab)
- 使用
key: value
的形式表示键值对 - 支持列表、嵌套结构等复杂数据类型
例如:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
关于
.yaml
和.yml
的区别:在 Spring Boot 项目中,YAML 文件通常以
.yaml
或.yml
作为文件扩展名。这两种扩展名本质上是相同的,它们都表示 YAML 格式的文件。
.yaml
是 YAML 文件的官方推荐扩展名,而.yml
是.yaml
的简写形式。在功能上两者完全等价,Spring Boot 对它们的解析方式没有任何区别,无论使用.yaml
还是.yml
,Spring Boot 都能正确加载和解析配置文件。如果同时存在
application.yaml
和application.yml
,Spring Boot 会优先加载application.yml
。
3.2、配置优先级
3.2.1、配置文件位置的优先级
优先级最高的配置是命令行参数,通过命令行传递的这个参数将会覆盖原配置:
java -jar app.jar --server.port=9999
不同位置配置文件的优先级分别为:
- 项目根目录下的
/config
子目录中的配置文件 - 项目根目录中的配置文件
- 类路径下的
/config
包中的配置文件 - 类路径根目录中的配置文件
3.2.2、配置文件格式的优先级
如果在同一个目录下同时存在 application.properties、application.yml、application.yaml 这几个文件,那么 Spring Boot 对配置文件的加载优先级为:
application.properties > application.yml > application.yaml
3.3、读取配置文件的方式
假设在 YAML 配置文件中存在如下配置:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_db?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
userInfo:
name: 张三
age: 30
likes:
- 游戏
- 健身
- 读书
3.3.1、使用@Value注解
@Value
注解可以直接将配置文件中的单个属性值注入到类的字段中。
@Component
public class ConfiurationBean {
// 简单属性
@Value("${spring.datasource.url}")
private String url;
// 数组
@Value("${userInfo.likes}")
private String[] likes;
// 数组里的其中一个属性
@Value("${userInfo.likes[1]}")
private String like;
// ...
}
3.3.2、使用Environment对象
在 Spring Boot 中,Environment
(org.springframework.core.env.Environment)是一个用于管理应用程序运行时环境配置信息的接口,它可以使开发者方便地获取和使用项目的配置参数,无论是来自 application.properties
、application.yml
文件,还是系统环境变量、命令行参数等。
在需要使用 Environment
对象的类中,可以使用 @Autowired
注解将 Environment
对象自动注入进来,然后在类的方法中使用 getProperty()
方法获取配置信息。
@Component
public class ConfiurationBean {
@Autowired
private Environment env;
public void printProperty() {
// 获取并使用属性
String port = env.getProperty("server.port");
System.out.println(port);
}
}
3.3.3、将部分配置封装成实体类
创建一个 Java 实体类,属性与配置项一一对应,使用 @ConfigurationProperties
注解将配置文件中的属性绑定到该 Java 对象上:
@Component
@ConfigurationProperties(prefix = "userInfo")
public class UserInfo() {
private String name;
private int age;
private String[] likes;
// get方法、set方法、构造方法
}
3.4、多环境开发时配置文件的切换
在项目的开发中,常常需要在多个环境(开发环境 dev、生产环境 prod 等)部署项目,并且每个环境的配置可能都不太一样(如日志等级、数据库属性等),因此每个环境都有单独的一个配置文件。
Spring Boot 支持根据不同的环境加载不同的配置文件,常用的做法是建一个公共配置文件 application.properties
或 application.yml
来存放每个环境中相同的配置,再给每一个环境建一个单独的配置文件存放个性化配置,该配置文件的命名规则为 application-{profile}.properties
或 application-{profile}.yml
。
例如开发环境的配置文件为 application-dev.yml
,生产环境的配置文件为 application-prod.yml
,则在公共配置文件 application.yml
中激活指定配置文件的方式为:
spring:
profiles:
active: dev
也可以在启动项目 JAR 文件时通过命令行参数 spring.profiles.active
指定:
java -jar app.jar --spring.profiles.active=dev
如果既在公共配置文件 application.yml/application.properties
中指定了激活哪个配置文件,又通过命令行参数指定,则最后生效的是命令行参数,因为命令行参数的优先级最高。
在 IDEA 中也可以直接指定命令行参数:
新版本 IDEA:
3.5、yml配置文件示例
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_db?useSSL=false&setUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源用druid
type: com.alibaba.druid.pool.DruidDataSource
# MyBatis配置
mybatis:
# 指定Mapper XML文件的位置
mapper-locations: classpath:mapper/*.xml
# 实体类的包路径
type-aliases-package: com.example.demos.web
configuration:
# 开启驼峰命名映射
map-underscore-to-camel-case: true
# 项目日志等级
logging:
level:
# 全局日志等级
root: info
# 设置MyBatis的日志级别为DEBUG
com.example.mapper: debug
org.mybatis: debug
org.apache.ibatis: debug
# 自定义配置
四、整合MyBatis
4.1、添加起步依赖
新版 IDEA 中可以直接在 pom.xml 文件的 <dependencies>
标签旁边点击 “Add Starters” 添加 MyBatis 与 MySql 的起步依赖:
或者手动在 pom.xml 文件中添加 MyBatis 的起步依赖与 MySQL、Druid 的依赖坐标:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.22</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
4.2、添加配置
然后在配置文件中添加数据源与 MyBatis 配置:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_db?useSSL=false&setUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
# MyBatis配置
mybatis:
# 指定Mapper XML文件的位置
mapper-locations: classpath:mapper/*.xml
# 实体类的包路径
type-aliases-package: com.example.demos.web
# 指定MyBatis的全局配置文件位置,可以进行更细颗粒度的MyBatis配置,不需要就不写
# config-location: classpath:mybatis-config.xml
configuration:
# 开启驼峰命名映射
map-underscore-to-camel-case: true
# 项目日志等级
logging:
level:
# 全局日志等级
root: info
# 设置MyBatis的日志级别为DEBUG
com.example.mapper: debug
org.mybatis: debug
org.apache.ibatis: debug
4.3、扫描Mapper接口
最后在写接口的时候在上面用 @Mapper
注解标记一下这是 MyBatis 的 Mapper 接口:
@Mapper
public interface UserMapper {
User select();
// ...
}
或者直接在 Spring Boot 启动类上面用注解 @MapperScan()
进行全局配置扫描,指定 Mapper 接口类的包路径,Spring 会自动扫描该包下的所有接口,并将其注册为 MyBatis 的 Mapper 接口,无需在每个接口上都添加 @Mapper
注解。
@SpringBootApplication
@MapperScan("com.example.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
至此,Spring Boot 框架整合 MyBatis 框架完成。
五、使用Maven打包Spring Boot项目
在 pom.xml
文件中,确保配置了 Spring Boot Maven 插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.3</version>
<configuration>
<!-- 指定启动程序主类 -->
<mainClass>com.example.demo.DemoApplication</mainClass>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
在项目根目录下运行打包的命令:
# 其实是两条命令,mvn clean是清除项目target目录下的文件,mvn package打包命令,两个命令一起执行。
# -Dmaven.test.skip=true表示排除测试代码之后打包
mvn clean package -Dmaven.test.skip=true
或者在 IDEA 中依次操作 clean 与 package:
打包时,一般都要先进行 clean 操作清理项目之前构建过程中生成的临时文件和输出文件,使项目恢复到初始状态,目的是确保项目不会受到之前构建结果的影响,避免旧的文件干扰新的构建过程。
打包完成后,会生成两个 JAR 文件,其中一个后缀为 .original,只包含工程中的 Class,不包含依赖;另一个后缀为 .jar 的文件是 SpringBoot 打包插件创建的,包含了应用依赖和 Spring Boot 相关的 Class,可以直接运行。生成的 JAR 文件保存在 target 目录下,文件名为 {项目名称}-{版本号}.jar
。例如:demo-0.0.1-SNAPSHOT.jar
使用以下命令运行打包好的 JAR 文件:
java -jar demo-0.0.1-SNAPSHOT.jar
并且可以通过命令来指定部分参数:
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=9999 --spring.profiles.active=prod
评论 (0)