SpringBoot3快速启动框架
文章目录
前言
spring:spring家族的产品
boot:启动
用来创建spring应用,springboot提供了不同类型的启动器,依靠启动器来导入依赖包,springboot内部也有maven依赖。
springboot整合其他框架,主要是在配置文件中添加相关的配置信息,不设置也行,springboot提供了默认值。
springboot与spring使用对比:
1、spring:导入依赖,每整合一种框架需要编写其配置文件+相关语法,对于web项目需要将项目加入到tomcat中,并启动运行
2、springboot:导入依赖(启动类帮忙连带着导入了所需依赖),springboot有一个配置文件(可以将不同的环境的配置文件分离出去,在这里激活使用),每整合一种框架只需要在这里编写相关的属性,无需再自己编写配置类了,springboot会根据配置的信息自动实现以前spring编写配置类的功能
一、Spring Boot3介绍
1.1 SpringBoot3简介及版本
1、spring程序配置方式:XML、注解、Java配置类或混合用法,过于复杂和繁琐,对于单体项目,用spring是方便的,但是微服务,每一个服务都需要配置、注解。
2、SpringBoot 定义:可以简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring),SpringBoot 只需要编写少量配置即可快速整合 Spring 平台以及第三方技术!
3、SpringBoot目标
- 为所有 Spring 开发提供更快速、可广泛访问的入门体验。
- 开箱即用,设置合理的默认值,但是也可以根据需求进行适当的调整。
- 提供一系列大型项目通用的非功能性程序(如嵌入式服务器、安全性、指标、运行检查等)。
- 约定>配置,基本不需要主动编写配置类、也不需要 XML 配置文件。
4、SpringBoot3特性
- 快速创建独立 Spring 应用
- SSM:导包、写配置、启动运行
- 直接嵌入Tomcat、Jetty or Undertow(无需部署 war 包)【Servlet容器】
- linux java tomcat mysql: war 放到 tomcat 的 webapps下
- jar: java环境; java -jar
- 重点:提供可选的starter,简化应用整合
- 场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存…
导包一堆,控制好版本。 - 为每一种场景准备了一个依赖; web-starter。mybatis-starter
- 场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存…
- 重点:按需自动配置 Spring 以及 第三方库
- 如果这些场景我要使用(生效)。这个场景的所有配置都会自动配置好。
- 约定大于配置:每个场景都有很多默认配置。
- 自定义:配置文件中修改几项就可以
- 提供生产级特性:如 监控指标、健康检查、外部化配置等
- 监控指标、健康检查(k8s)、外部化配置
- 无代码生成、无xml
总结:简化开发,简化配置,简化整合,简化部署,简化监控,简化运维。
5、自动配置机制
(1)初步理解:
- 自动配置的 Tomcat、SpringMVC 等
- 导入场景,容器中就会自动配置好这个场景的核心组件。
- 以前:DispatcherServlet、ViewResolver、CharacterEncodingFilter…
- 现在:自动配置好的这些组件
- 验证:容器中有了什么组件,就具有什么功能
- 默认的包扫描规则
- @SpringBootApplication 标注的类就是主程序类
- SpringBoot只会扫描主程序所在的包及其下面的子包,自动的component-scan功能,在此包之外,哪怕写了MVC的组件注解也无法扫描存入IOC容器之中
- 自定义扫描路径(如果非要放在默认之外,需要给注解加内容配置)
①@SpringBootApplication(scanBasePackages = “com.fanxy”)
② @ComponentScan(“com.fanxy”) 直接指定扫描的路径,这是因为上面的 @SpringBootApplication 注解包含内嵌了三个注解:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
- 配置默认值
- 配置文件的所有配置项是和某个类的对象值进行一一绑定的。(可以在配置文件中利用server.port=xxxx配置,然后使用ctrl + 左键 进入对应的一个类ServerProperties)
- 绑定了配置文件中每一项值的类: 属性类。
- 比如:
ServerProperties绑定了所有Tomcat服务器有关的配置
MultipartProperties绑定了所有文件上传相关的配置
…参照官方文档:或者参照 绑定的 属性类。
- 按需加载自动配置
- 导入场景spring-boot-starter-web
- 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter,是所有starter的starter,基础核心starter
- spring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration 自动配置类
- 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。
导入哪个场景就开启哪个自动配置
总结: 导入场景启动器、触发 spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相关场景的功能
(2)理解:导入starter-web:导入了web开发场景
- 场景启动器导入了相关场景的所有依赖:starter-json、starter-tomcat、springmvc
- 每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。
- 核心场景启动器引入了spring-boot-autoconfigure包。
- spring-boot-autoconfigure里面囊括了所有场景的所有配置。
- 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
- SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。但利用下面主程序的注解就做到了导入。
6、开发环境版本要求
技术&工具 | 版本(or later) |
---|---|
SpringBoot | 3.0.5 |
maven | 3.6.3 or later 3.6.3 或更高版本 |
Tomcat | 10.0+ |
Servlet | 9.0+ |
JDK | 17+ |
1.2 快速入门
场景:浏览器发送/hello请求,返回"Hello,Spring Boot 3!"
1、springboot实现流程
- 创建maven工程导入依赖:
- springboot父工程项目 :个boot项目都有一个父项目spring-boot-starter-parent,该parent的父项目是spring-boot-dependencies,这个父项目 版本仲裁中心,把所有常见的jar的依赖版本都声明好了。
- 启动器依赖:无需指定版本,Starter包含了一组相关的依赖项,以便在启动应用程序时自动引入所需的库、配置和功能。Starter说明是一组预定义的依赖项集合,旨在简化Spring应用程序的配置和构建过程。比如spring-boot-starter-web是web开发场景的启动器!
启动器的作用:简化依赖管理、自动配置、约定优于配置、快速启动和开发应用程序(springboot提供了多种类型的启动器starter,如Web开发spring-boot-starter-web、数据访问data-jpa、安全性security、消息传递等的Starter)、模块化和可扩展性(每个模块可以有自己的Starter和依赖项,使得应用程序的不同部分可以按需进行开发和扩展)
- 编写springboot配置文件:一般会有默认值,比如使用了mybatis,原本mybatis需要配置文件,现在写在这里即可!
- 编写启动引导类(springboot项目运行的入口)
- 启动引导类:添加注解@SpringBootApplication作用:自动配置、组件扫描、声明配置类
代码:SpringApplication.run(类名.class, args):创建ioc容器、加载配置、启动内置的web服务器
- 启动引导类:添加注解@SpringBootApplication作用:自动配置、组件扫描、声明配置类
- 编写处理器Controller:还是需要添加相关的注解
- 启动项目:启动引导类即可
springboot可以快速创建一个项目,但是它的底层还是应用了spring、springmvc那些东西。springboot是减少了配置,注解还是要写,简化了一些
二、SpringBoot3配置文件
2.1 统一配置管理概述
1、统一配置文件:SpringBoot工程下,统一在这一个文件完成程序功能参数设置和自定义参数声明(端口号、项目根路径、数据库连接信息等)。位置src/main/resources;必须命名为application 后缀 .properties(优先级更高) / .yaml / .yml;配置基本都有默认值。
因为src/main/resources目录是Spring Boot默认的类路径(classpath),配置文件会被自动加载并可供应用程序访问。
功能配置参数说明:需要配置哪些参数直接去网站上找即可
Common Application Properties (spring.io)
1、不同配置文件的使用
- 属性配置文件properties:为所有框架提供配置参数的位置,但是多层命名比较麻烦!
语法:固定功能的key或自定义的key;key不能重复;
springboot配置文件文件properties示例
#固定的
# 启动端口号
server.port=80
#自定义
spring.jdbc.datasource.password=root
- YAML配置文件使用:基于层次结构的数据序列化格式,有层次,可以继承的配置文件格式。
语法:多值“-”;key/value对“:”;扩展名“.yaml”/“yml”;树形结构呈现
yaml配置文件示例
#固定的
server:
port: 80
#自定义
zwf:
bf:
-zy
-slw
age : 18
读取配置文件方式:
- @Value:在属性上添加,@Value(“${spring.jdbc.datasource.password}”)。
注意点:key必须写全,且只能读单个值 - 注解@ConfigurationProperties:声明该类要读取属性配置,将一些配置属性批量注入到bean对象
prefix=“xx.xxx.xxxx” 读取属性文件中前缀为xx.xxx.xxxx的值。前缀.实体类中属性名 = 配置文件中的key,才能注入成功。
以读取yaml配置文件为例
@Component
@ConfigurationProperties(prefix = "zwf")
public class DataSourceConfigurationProperties {
private List<String> bf; //可以为集合赋值
private String age;//属性名=最后一个key值
}
2.2 多环境配置和使用
1、多环境配置定义:在Spring Boot中,可以使用多环境配置来根据不同的运行环境(如开发、测试、生产)加载不同的配置。让应用程序在不同的环境中使用不同的配置参数,例如数据库连接信息、日志级别、缓存配置等。
2、多环境配置方式:属性文件/YAML文件相似
方式:将应用程序的配置参数分离到不同的配置文件中,每个环境对应一个属性文件。
不同配置文件的命名方式application-xxx.后缀名,分别定义各自环境的配置参数。
激活方式:
- spring.profiles.active=xxx(即-后的名字),指定当前使用的环境,Spring Boot会加载对应环境的配置文件,覆盖默认的配置,从而实现多环境配置。在application配置文件中,如果与现有的重复,该active设置优先!
- springboot可以打包jar,可以在启动项目的时候进行配置具体激活哪个环境配置。
以配置文件YAML为例
#激活不同环境示例:比如有两种不同的环境的配置文件
#第一种:application-dev.yml(开发)
spring:
jdbc:
datasource:
username: root
#第二种:application-test.yml(测试)
spring:
jdbc:
datasource:
username: root
#application.yaml:中激活第一种
spring:
profiles:
active: dev
3、多环境配置作用
可以配置多环境配置参数不同
可以将不同块的参数分离到不同的配置文件中,使得主配置文件架构更清晰
三、SpringBoot3整合SpringMVC
3.1 实现流程
创建项目→导入依赖(继承父项目spring-boot-starter-parent+web开发场景的启动器spring-boot-starter-web)→创建启动器类(加上注解@SpringBootApplication)→编写配置文件→创建实体类→编写controller(改写的注解和之前springmvc的配置一样)→启动启动器访问即可
3.2 springboot的web应用程序配置
描述了Spring Boot的配置文件中与Web应用程序相关的一些重要配置参数。
springboot得底层实现还是封装了springmvc的配置,实现了springmvc的功能!
springboot会有默认值:配置文件参考网站的“Server Properties”配置
常用的几个参数如下:
- 服务器server:
- 应用程序的HTTP服务器端口号:server.port,默认是8080
- 应用程序的上下文路径:server.servlet.context-path,默认为空
- 视图解析器的前缀和后缀:spring.mvc.view.prefix/suffix,视图解析器用于解析控制器返回的视图名称,并将其映射到实际的视图页面。
- 静态资源的位置:spring.resources.static-locations,静态资源(html、CSS、JavaScript、图像)默认位置classpath:/META-INF/resources/或/resources/或/static/或/public/,放在任意一个都允许直接访问,springmvc都会处理。如果设置了就会覆盖默认值,如果值classpath:/webapp
- HTTP请求和响应的字符编码:spring.http.encoding.charset/enabled前者用于定义字符编码的名称(例如UTF-8),后者用于启用或禁用字符编码的自动配置。
3.3 自定义拦截器(SpringMVC配置)
声明一个拦截器:springmvc提供了HandlerInterceptor可以在内部进行拦截(handler前后、视图解析器后)——分别有三种方法preHandle() 、postHandle() 、afterCompletion() 实现相关拦截功能即可。
定义springmvc的配置类:自动装配拦截器并为拦截器添加拦截路径。该配置类需要实现规范接口WebMvcConfigurer,并添加注解@Configuration表示这是一个配置类,在springboot启动器中就会自动扫描到。
定义拦截器后,拦截器的使用:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor ;//自动装配拦截器
/**
* /** 拦截当前目录及子目录下的所有路径 /user/** /user/findAll /user/order/findAll
* /* 拦截当前目录下的以及子路径 /user/* /user/findAll
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
四、SpringBoot3整合Druid数据源
1、整合的功能:数据库连接池【实现】、监控页面
Druid兼容SpringBoot2,对于SpringBoot3还需要写兼容性的配置(比如springboot中缺少对druid得自动装配,这就需要自己添加)
4.1 实现流程
- 创建项目
- 导入依赖:如果指定版本信息的话就会覆盖springboot3中默认的版本
- 继承父项目:spring-boot-starter-parent
- web开发的场景启动器:spring-boot-starter-web
- 数据库相关配置启动器 jdbctemplate事务相关:spring-boot-starter-jdbc
- druid启动器的依赖:druid-spring-boot-3-starter 1.2.18
- 驱动类:mysql-connector-java 8.0.28、lombok 1.18.28
- SpringBoot应用打包插件:spring-boot-maven-plugin
- 创建启动器类(加上注解@SpringBootApplication)
- 编写配置文件:配置连接数据库的一些信息,可以参照springboot3参数配置网站,这里主要添加druid连接池的基本配置。与springboot2的配置区别:username、password这些信息可以直接写在datasource下。
- 准备实体类:根据数据库来配
- 编写controller:这里为了测试效果就直接在这里添加sql语句对数据库进行操作即可!
springboot3整合druid的配置文件
spring:
datasource:
# 连接池类型
type: com.alibaba.druid.pool.DruidDataSource
# Druid的其他属性配置 springboot3整合情况下,数据库连接信息必须在Druid属性下!
druid:
url: jdbc:mysql://localhost:3306/day01
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 初始化时建立物理连接的个数
initial-size: 5
# 连接池的最小空闲数量
min-idle: 5
# 连接池最大连接数量
max-active: 20
# 获取连接时最大等待时间,单位毫秒
max-wait: 60000
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
# 既作为检测的间隔时间又作为testWhileIdel执行的依据
time-between-eviction-runs-millis: 60000
# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)
min-evictable-idle-time-millis: 30000
# 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)
validation-query: select 1
# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-borrow: false
# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-return: false
# 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。
pool-prepared-statements: false
# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
max-pool-prepared-statement-per-connection-size: -1
# 合并多个DruidDataSource的监控数据
use-global-data-source-stat: true
logging:
level:
root: debug
配置了druid后的使用方式
@Slf4j //输出数据库日志
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired //自动装配
private JdbcTemplate jdbcTemplate;
@GetMapping("/getUser")
@ResponseBody
public User getUser(){
String sql = "select * from users where id = ? ; ";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
log.info("查询的user数据为:{}",user.toString());
return user;
}
}
4.2 不兼容错误
错误:cannot load driver class:org.h2.Driver
原因:启动器druid-spring-boot-3-starter目前最新版本是1.2.18,虽然适配springboot3,但是springboot3中缺少自动装配的配置文件
解决方法:手动在resources目录下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容为com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
五、SpringBoot3整合Mybatis
5.1 Mybatis整合实现流程
需要填为启动类添加@MapperScan注解,用于扫描和注册Mapper接口!
- 导入依赖:父工程+MyBatis和数据库驱动的相关依赖。如果使用MySQL数据库,需要添加MyBatis和MySQL驱动的依赖。这里整合的依赖比上面整合druid多了一个启动器:mybatis-spring-boot-starter!
- 配置配置文件:比如数据源(数据库URL、用户名、密码)——注意这里兼容性还需要向上面那样添加相关的配置文件实现自动装配;mybatis的功能配置(settings、别名…)——替代mybatis-config.xml配置文件,mybatis相关的都在这里配置!
- 创建程序启动类
- 创建实体类:创建与数据库表对应的实体类。
- 创建Mapper接口:创建与数据库表交互的Mapper接口。
- 创建Mapper接口SQL实现: 可以使用mapperxml文件或者注解方式
- 注解扫描:在Spring Boot的程序启动类添加@MapperScan注解,比如@MapperScan(" com.atguigu.mapper "),用于扫描和注册Mapper接口。该注解可以实现在需要使用数据库操作的地方,通过依赖注入或直接实例化Mapper接口,并调用其中的方法进行数据库操作。
- 编写三层架构实现相关功能!
springboot3整合mybatis的配置文件
server:
port: 80
servlet:
context-path: /
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql:///day01
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis: #替代之前mybatis配置文件/mybatis配置类
configuration: # setting配置
auto-mapping-behavior: full
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
type-aliases-package: com.atguigu.pojo # 配置别名
mapper-locations: classpath:/mapper/*.xml # mapperxml位置
5.2 整合声明式事务&AOP
1、事务:针对数据库操作的,实现自动回滚,避免出现问题!
只需要导入依赖spring-boot-starter-jdbc启动器
SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了
2、整合AOP
导入依赖spring-boot-starter-aop启动器
创建切面类,直接使用aop注解即可,那些开启@EnableAspectJAutoProxy注解支持的都不需要了
切面的创建
@Component
@Aspect //表示这是一个切面类
@Order //设置切面类的优先级
public class LogAdvice {
@Before("execution(* com..service.*.*(..))")
public void before(JoinPoint joinPoint){ //JoinPoint可以获取目标类/方法信息!环绕通知实现的重要参数!
System.out.println("LogAdvice.before");
System.out.println("joinPoint = " + joinPoint);
}
}
六、SpringBoot3项目打包和运行
1、对比普通web项目工程
普通web项目:打包war,放在tomcat/webapp下,启动tomcat后war会自动解压,就可以访问这个资源了
springboot工程内置服务器软件:打包jar(包含服务器软件),命令执行java -jar xx
2、打包运行流程
- 需要在项目中添加插件spring-boot-maven-plugin:作用是支持将项目打包成可执行的可运行jar包,如果不添加使用常规命令java -jar运行打包后的springbbot项目是无法找到应用程序的入口点
springboot3配置文件:配置springboot3工程项目的打包方式
<!-- SpringBoot应用打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 打包jar:可以在idea开发工具中maven方式package就会在target目录下出现相关的jar包
- 运行:对于springboot项目工程jar包可以独立运行,java -jar命令用于在Java环境中执行可执行的JAR文件。
对于springboot3工程项目的jar的运行命令
//可以在命令窗口cmd执行
//这里也可激活指定的多环境
//命令格式:java -jar [选项] [参数] <jar文件名>
//1、-D<name>=<value>:设置系统属性
java -jar -Dserver.port=8080 myapp.jar。
//2、-X:设置JVM参数,如内存大小、垃圾回收策略。-Xmx<size>最大堆内存、-Xms<size>:初始堆内存大小
//3、-Dspring.profiles.active=<profile>:指定Spring Boot的激活配置文件
java -jar -Dspring.profiles.active=dev myapp.jar
除了上述的打包方式,可以使用idea工具直接执行,会帮我们打包并运行。
七、SpringBoot3整合总结
springboot3想要整合什么样的的框架,需要添加相关依赖(不同的启动器)→在配置文件中配置相关的的配置信息(不配置的话也会有默认值)→对于一些添加的第三方依赖无需@Bean注册组件,只需要直接声明@Autowired自动装配即可,但是一些不兼容(比如springboot3中缺少druid的自动装配的配置文件),此时也无需@Bean注册组件,只需要像上面解决druid装配错误的解决方法一样为其添加自动装配的配置信息。
创建启动类→正常实现相关功能即可!
springboot在整合mybatis、mybatisplus时,即有连接数据库需求时都需要在配置文件application.yaml中配置自己的数据库连接池信息。需要在启动类(用注解@SpringBootApplication标识)中再添加上注解@MapperScan(“com.atguigu.mapper”)。
注意:在使用SpringBoot3时用到druid连接池,必须要要完善连接池配置,因为springboot3中缺少自动装配
完善方式:文件夹META-INF.spring下文件org.springframework.boot.autoconfigure.AutoConfiguration.imports,添加内容内容:com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure