一、 SpringBoot 和 JDK 的对应版本
不同的 SpringBoot 版本要求的 JDK、Maven、Gradle、Servlet 的版本都不一样,甚至要求的 IntelliJ IDEA 的版本都不一样,比如 IDEA 2020 不支持 JDK17,如果想要使用 JDK17 只能升级 IDEA 版本。
官方更新维护的版本
目前(2024-02-20)在 Spring 社区支持下免费更新的版本有:3.1.x 和 3.2.x,3.1.x支持到 2024-05-18,3.2.x 支持到 2024-11-28。这些数据都可以在 Spring 官网(spring.io)查询到,查询路径:Projects | SpringBoot | SUPPORT。
支持的 JDK 版本
查询路径:Projects | SpringBoot | LEARN | Reference Doc | Getting Started | System Requirements
JDK8 支持的最后一个 SpringBoot 版本:2.7.x,2.7.x 支持的 JDK 版本:8 - 21,后续版本 3.0.x、3.1.x、3.2.x 支持的 JDK 版本:17 - 21。
二、创建 SpringBoot 项目(IDEA 2023.3.2)
Spring Initializr
IDEA | New Project | Spring Initializr,弹出创建页面。如图,当前支持的最低 JDK 版本是 JDK17。
如果需要支持 JDK8,可以修改 Server URL 为 https://start.aliyun.com/
注意:IDEA 2020 修改 Server URL 会报错,建议升级 IDEA 版本。
选择 SpringBoot 版本
因为是使用 JDK8,所以直接选择最后一个支持的版本(最新的) 2.7.6
依赖选择
1、WEB(必备)
Spring Web
此模块已经包含 tomcat,不用再去引用 tomcat 的依赖。引用这一个依赖,就可以实现简单的接口了 —— 编写一个方法,加上接口的注解,返回“Hello world”。
2、数据库(可选)
MySQL Driver - mysql-connector-j
MyBatis Framework - mybatis-spring-boot-starter
JDBC API - spring-boot-starter-jdbc(不需要引入)
MySQL Driver 会引入驱动包,也就是真正操作mysql数据库的客户端。spring-boot-starter-jdbc 会引入 HikariCP 连接池、事务等等功能,而 mybatis-spring-boot-starter 包含了 spring-boot-starter-jdbc,所以就不用引入 JDBC API 了。
3、个人常用(Maven 坐标)
fastjson2
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.47</version>
</dependency>
apache 常用工具包
<!-- http请求 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.10</version>
</dependency>
<!-- 字符处理 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
三、基本配置
数据库配置一:配置数据库账号、密码等
如果引入了数据库的依赖,这里就需要配置。引入 MySQL Driver,不使用数据库连接可以不用配置,可以正常启动;引入包含 spring-boot-starter-jdbc 的依赖必须配置,因为启动需要初始化连接池,没有账号密码谈何初始化。
以下是 yml 的配置,properties 的配置是一样的,只是格式不一样。
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: 123456
数据库配置二:Mybatis Bean 扫描配置
如果使用 Mybatis 则需要配置。
1、启动类 xxApplication.java 类名上增加扫描注解 @MapperScan
默认是扫描类路径,可以指定 value 缩小扫描的范围。如果有用 @Autowired 注入 DAO 的 Bean,这个注解必须加上,不然自动装配 Bean 的时候因为扫描不到导致初始化失败将导致启动报错和启动失败。
@MapperScan("zz.gavin.**.dao")
2、pom.xml 增加配置:
maven 默认是不会打包 src/main/java 文件夹下的 xml 文件,如果你和我一样,习惯将 DAO层 的 Java 和 XML 放到一起,这一步必须要配置。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**</include>
</includes>
</resource>
</resources>
</build>
3、Java 和 XML 命名尽量一致,不一致需要配置 mybatis.mapper-locations
Java 和 XML 命名一致的情况下(同名同位置),如 UserDAO.java 和 UserDAO.xml,Spring 扫描到会自动装配成 Bean - userDAO;
但如果命名不一致,比如 UserDAO.java 和 SystemUserDAO.xml,自动装配会失败,而调用方法时(如 userDAO.get())会提示【Invalid bound statement (not found)】。这种情况下,建议修改成两者命名一致,实在做不到,可以增加配置 mybatis.mapper-locations,同名不同位置也要配置,如下。
# 两种写法都行
mapper-locations: zz/gavin/demo/dao/*.xml
mapper-locations: classpath:zz/gavin/demo/dao/*.xml
四、打包
idea 里面 Maven 面板执行 clean、package 即可。
默认打包成 jar,如何改成 war 打包?
很简单,创建多一个项目,打包方式选 war,简单对比即可知晓两者的差异。
差异主要有三处,直接修改也可,如下
1、pom.xml, project标签下修改/新增
<packaging>war</packaging>
2、pom.xml, 新增依赖。也不算新增,只是把 tomcat 依赖改为 provided。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
3、启动类 xxApplication.java
3.1 extends SpringBootServletInitializer
3.2 新增方法
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(xxApplication.class);
}
五、其他问题
使用阿里的脚手架初始化,有一个问题需要注意:
pom.xml | build | plugin(spring-boot-maven-plugin)| configuration | skip,这个配置设置为了 true,该参数的意思是 取消生成可执行 jar,用于多模块项目构建。比如父包和子包,想实现效果:子包不需要可执行,父包作为启动的可执行包,如何做呢?只需要子包添加 skip 标签设置为 true,而父包则不用该标签就可以了。
正常单模块项目,这个 skip 标签要删除掉,不然生成的 jar 不能执行。
有没有 skip 有三点直观的区别:
1、有 skip jar 包里面的 META-INF/MANIFEST.MF 文件会缺少 Start-Class 等参数。
2、只引入 springboot-web 的项目打包,有 skip jar 只有 8k,没有则为 17M。
3、正常打包有两个文件,.jar、.jar.original,有 skip 则没有 .jar.original 文件。