一、SpringBoot3 介绍
1.1 SpringBoot 简介
目前为止,我们已经学习了多种配置 Spring 程序的方式,例如:XML、注解、Java 配置类以及混合用法,但是这些方式很繁琐,所以引入了 SpringBoot
SpringBoot 可以简化 Spring 应用的创建及部署(底层是 Spring),SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术
1.2 系统环境要求
技术&工具 |
版本 |
Maven |
3.6.3 or later 3.6.3 或高版本 |
Tomcat |
10.0+ |
Servlet |
9.0+ |
JDK |
17+ |
二、快速入门
2.1 案例
场景:浏览器发送 /hello 请求,返回 “Hello,SpringBoot3”
开发步骤:
- 创建 Maven 工程
- 添加依赖(SpringBoot 父工程依赖,Web 启动器依赖)
- 编写启动引导类(SpringBoot 项目运行入口)
- 编写处理器 Controller
- 启动项目(运行启动类即可)
具体实现:
2.2 总结
为什么依赖不用写版本?
父项目 spring-boot-starter-parent 的父项目 spring-boot-dependencies 中提供了所有常见的 jar 包依赖版本
启动器(Starter)是什么?
启动器是一个整合包,整合了一组相关的依赖和配置,在启动应用程序时可以自动引入所需的库、配置和功能
springboot 提供的全部启动器
命名规范:
- 官方提供:spring-boot-starter-*
- 第三方提供:*-spring-boot-starter
@SpringBootApplication 注解的作用?
他是添加到启动类的一个组合注解
1 2 3 4
| @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication {}
|
三、SpringBoot3 配置文件
3.1 统一配置管理
SpringBoot 工程下,进行统一的配置管理,将配置信息集中到配置文件(application.properties
或 application.yml
)中即可
如果同时存在 application.properties 和 application.yml(.yaml),properties 优先级更高
配置文件放在 src/main/resources 目录下
官方提供的参数
3.2 属性配置文件使用
application.properties:
1 2 3 4 5 6 7 8 9
|
server.port=80
spring.jdbc.datasource.driverClassName=com.mysql.cj.jdbc.driver spring.jdbc.datasource.url=jdbc:mysql://spring spring.jdbc.datasource.username=root spring.jdbc.datasource.password=root
|
读取自定义的参数,使用 @Value
注解即可:
1 2 3 4 5
| @Component public class DataSourceProperties { @Value("${spring.jdbc.datasource.username}") private String username; }
|
3.3 YAML 配置文件使用
YAML 格式介绍
YAML 是一种基于层次结构的数据序列化格式,可以提供易读的数据表示方式
该格式相对于 .properties
文件,复杂的配置具有更好的可读性
YAML 语法
① 数据结构用树形结构呈现,缩进表示层级
② 连续的项目(集合)用减号 “-” 表示
③ 键值对 key/value 用冒号 ”:“ 分隔,冒号后边必须加空格!!
④ 文件扩展名为 yml
或 yaml
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| app_name: 我的应用程序 version: 1.0.0 author: 张三
database: host: localhost port: 5432 username: admin password: password123
features: - 登录 - 注册 - 仪表盘
settings: analytics: true theme: dark
|
读取方式与 properties 一致,使用 @Value
即可
3.4 批量配置文件注入
使用 @Value
只能读取单个值,我们可以使用 @ConfigurationProperties
注解,将配置属性批量注入到 bean 对象
在类上添加该注解即可:
1 2 3 4 5 6 7 8 9
| @Component @ConfigurationProperties(prefix = "spring.jdbc.datasource") public class DataSourceConfigurationProperties { private String driverClassName; private String url; private String username; private String password; }
|
3.5 多环境配置和使用
在 SpringBoot 中,可以使用多环境配置,根据不同的运行环境(如开发、测试、生产)加载不同的配置
以 yaml 文件为例:
多环境配置
创建开发、测试、生产三个环境的配置文件
application-dev.yml(开发)
1 2 3 4 5 6 7
| spring: jdbc: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://dev username: root password: root
|
application-test.yml(测试)
1 2 3 4 5 6 7
| spring: jdbc: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://test username: root password: root
|
application-prod.yml(生产)
1 2 3 4 5 6 7
| spring: jdbc: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://prod username: root password: root
|
环境激活
application.yml
1 2 3
| spring: profiles: active: dev
|
注意:如果设置了 spring.profiles.active,并且和 application 有重叠属性,以 active 设置的属性优先
四、SpringBoot3 整合 SpringMVC
4.1 实现过程
第一步:pom.xml 添加依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?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 http://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>3.2.3</version> </parent>
<groupId>com.shameyanng</groupId> <artifactId>springboot-002-springmvc</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
|
第二步:编写启动类
1 2 3 4 5 6
| @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
|
第三步:编写 Controller
第四步:访问测试
4.2 Web 相关配置
resources/application.yml
1 2 3 4 5 6 7
| server: port: 80 servlet: context-path: /boot
|
五个常用配置参数:
server.port
HTTP 服务器端口号,SpringBoot 默认使用 8080
server.servlet.context-path
设置应用程序的上下文路径,即项目根路径
spring.mvc.view.prefix 和 spring.mvc.view.suffix
配置视图解析器的前缀和后缀
spring.resources.static-locations
配置静态资源的位置
spring.http.encoding.charset 和 spring.http.encoding.enabled
配置 HTTP 请求和响应的字符编码
根据需求在配置文件中设置这些参数,更多参数查阅 官方文档
4.3 静态资源处理
SpringBoot 工程是一个 jar 工程,没有 webapp,官方定义了静态资源的默认查找路径,我们也可以自定义该路径
默认的静态资源路径:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
我们习惯把静态资源放在 resources/static 目录下
自定义静态资源路径:resources/webapp
1 2 3 4 5
| spring: web: resources: static-locations: classpath:/webapp
|
4.4 拦截器(SpringMVC 配置)
第一步:interceptor 包下声明拦截器
1 2 3 4 5 6 7 8 9
| @Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor拦截器的preHandle方法执行...."); return true; } }
|
第二步:拦截器配置
正常使用配置类,保证配置类在启动类的同包或子包即可生效
1 2 3 4 5 6 7 8 9 10
| @Configuration public class SpringMvcConfig implements WebMvcConfigurer { @Resource private MyInterceptor myInterceptor;
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); } }
|
五、SpringBoot3 整合 Druid 数据源
第一步:创建 Maven 工程
第二步:pom.xml 引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?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 http://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>3.2.3</version> </parent>
<groupId>com.shameyanng</groupId> <artifactId>springboot-003-druid</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.21</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </dependency> </dependencies> </project>
|
第三步:编写启动类
1 2 3 4 5 6
| @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
|
第四步:编写 application.yml 配置文件,添加 druid 连接池的基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| spring: datasource: type: com.alibaba.druid.pool.DruidDataSource
druid: url: jdbc:mysql://localhost:3306/xxx username: root password: xxx driver-class-name: com.mysql.cj.jdbc.Driver initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 test-while-idle: true time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 30000 validation-query: select 1 test-on-borrow: false test-on-return: false pool-prepared-statements: false max-pool-prepared-statement-per-connection-size: -1 use-global-data-source-stat: true
logging: level: root: debug
|
第五步:编写 Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Slf4j @RestController @RequestMapping("stu") public class StuController { @Resource private JdbcTemplate jdbcTemplate;
@GetMapping("getStu") public Student getStu() { String sql = "select * from t_student where sno = ?"; Student student = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Student.class), 2); log.info("查询的 student 数据为:{}", student.toString()); return student; } }
|
第六步:启动测试
六、SpringBoot3 整合 Mybatis
6.1 实现过程
第一步:创建 Maven 工程
第二步:pom.xml 引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <?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 http://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>3.2.3</version> </parent>
<groupId>com.shameyanng</groupId> <artifactId>springboot-004-mybatis</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.21</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
|
第三步:编写 application.yml 配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| server: port: 80 servlet: context-path: / spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: url: jdbc:mysql://localhost:3306/forssm username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
mybatis: configuration: auto-mapping-behavior: full map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl type-aliases-package: com.shameyang.pojo mapper-locations: classpath:/mappers/*.xml
|
第四步:编写实体类
1 2 3 4 5
| @Data public class Student { private String sno; private String sname; }
|
第五步:Mapper 接口和实现(XML)
1 2 3
| public interface StuMapper { List<Student> queryAll(); }
|
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.shameyang.mapper.StuMapper"> <select id="queryAll" resultType="student"> select * from t_student </select> </mapper>
|
第六步:编写 service 层
1 2 3
| public interface StuService { List<Student> stuList(); }
|
1 2 3 4 5 6 7 8 9 10
| @Service public class StuServiceImpl implements StuService { @Resource private StuMapper stuMapper;
@Override public List<Student> stuList() { return stuMapper.queryAll(); } }
|
第七步:编写 controller 层
1 2 3 4 5 6 7 8 9 10 11
| @RestController @RequestMapping("student") public class StuController { @Resource private StuServiceImpl stuService;
@GetMapping("list") public List<Student> getStudent() { return stuService.stuList(); } }
|
第八步:编写启动类和 mapper 接口扫描
1 2 3 4 5 6 7
| @MapperScan("com.shameyang.mapper") @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
|
第九步:启动测试
6.2 声明式事务整合
pom.xml 引入依赖:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
|
注:SpringBoot 项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了
1 2 3 4 5 6 7 8
| @Transactional public void update(){ User user = new User(); user.setId(1); user.setPassword("test2"); user.setAccount("test2"); userMapper.update(user); }
|
6.3 AOP 整合
pom.xml 引入依赖:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
|
直接使用aop注解即可:
1 2 3 4 5 6 7 8 9
| @Component @Aspect public class LogAdvice { @Before("execution(* com..service.*.*(..))") public void before(JoinPoint joinPoint){ System.out.println("LogAdvice.before"); System.out.println("joinPoint = " + joinPoint); } }
|
七、SpringBoot3 项目打包和运行
7.1 添加打包插件
在 Spring Boot 项目中添加 spring-boot-maven-plugin
插件是为了支持将项目打包成可执行的可运行 jar 包。如果不添加 spring-boot-maven-plugin
插件配置,使用常规的 java -jar 命令,打包后的 Spring Boot 项目无法找到应用程序的入口点,所以无法运行
1 2 3 4 5 6 7 8 9
| <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
|
7.2 执行打包
在 IDEA 中使用 Maven 中的 package 命令进行打包
可以在编译的 target 文件中查看 jar 包
7.3 命令启动和参数说明
java -jar 命令用于在 Java 环境中执行可执行的 JAR 文件
1
| 命令格式:java -jar [选项] [参数] <jar文件名>
|
参数说明:
-D<name>=<value>
:设置系统属性,例如:java -jar -Dserver.port=8080 myapp.jar
。可以通过 System.getProperty() 方法在应用程序中获取该属性值
-Dspring.profiles.active=<profile>
:指定 Spring Boot 的激活配置文件,可以通过 application-.properties 或 application-.yml 文件来加载相应的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar
-X
:设置 JVM 参数,例如内存大小、垃圾回收策略等
常用的选项包括:
-Xmx<size>
:设置 JVM 的最大堆内存大小,例如 -Xmx512m
表示设置最大堆内存为512MB
-Xms<size>
:设置 JVM 的初始堆内存大小,例如 -Xms256m
表示设置初始堆内存为256MB