# SpringBootDemo202602
**Repository Path**: nieps/spring-boot-demo202602
## Basic Information
- **Project Name**: SpringBootDemo202602
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-24
- **Last Updated**: 2026-02-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringBoot笔记
## 目标
* 掌握核心注解SpringBootApplication
* 掌握yaml配置文件 ---批量绑定
* 掌握多环境配置 (dev test prod)
* 掌握自动配置原理(面试题)
* 要求学会自定义启动器
* 统一日志框架
* 延伸: Spring security (安全 授权 )
## 核心 注解
SpringBootApplication注解:默认只会扫描当前类所在包及其子包下所有的类
## 批量绑定
条件:
* 统一前缀
* 对应属性名提供set方法
## 自动配置原理 (重点 面试题)
从以下几点回答:
1. SPI 机制
2. 再去解释自动配置原理
### 关于配置文件
官方的,所有的自动配置类,都在XXXAutoConfigure jar包下
#### 2.7版本之前
在类路径下:META-INF/spring.factories 这个配置文件中,有如下配置
~~~properties
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
.....
~~~
以上都是对应的自动配置类,应用启动时,sprigboot会用工具类SpringFactoriesLoader加载上面所有的自动配置类,根据类上的条件注解判断是否成立,成立则配置类生效,向容器注入相应的Bean
#### 2.7.x 版本
在类路径下:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件中,定义你的所有自动配置类,如下
~~~properties
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
....
~~~
#### 3.x 版本
在类路径下:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件中(除此还多了2个文件)
### 关于自动配置类
#### 2.7版本之前
~~~java
@Configuration(proxyBeanMethods = false)// 说明当前类是配置类
//启用属性批量绑定 ServerProperties提供默认值
@EnableConfigurationProperties(ServerProperties.class)
//条件 如果当前环境是servlet环境
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//如果当前环境中存在CharacterEncodingFilter这个类
@ConditionalOnClass(CharacterEncodingFilter.class)
//如果yml配置文件中你配置了server.servlet.encoding.enabled=false 条件不成立 matchIfMissing = true代表如果 没有配置该属性 默认条件成立值为true
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {}
~~~
#### 2.7版本之后
~~~java
@AutoConfiguration//标识为自动配置类
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnBooleanProperty(name = "server.servlet.encoding.enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {}
~~~
### 自动配置中的属性批量绑定
springboot 约定优于配置 ,提供了大众化的默认值
我们在使用新的启动器时,先查找对应的自动配置类,在配置类找@EnableConfigurationProperties,如果能找到 ,就可以查找可以配置的属性。
@EnableConfigurationProperties:启用属性的批量绑定 ,里面有对应的配置类,可以查看可以配置的前缀、属性等。
属性类名称:XXXProperties.java
自动配置类: XXXAutoConfiguration.java
### 条件注解
ConditionalOnBooleanProperty注解属性:通常设置开关变量
* value 属性名 与name属性 相互别名
* prefix 配置的属性前缀
* havingValue 期望的值 (可以不写)
* matchIfMissing 如果不配置该属性 默认值是什么,默认为false
## 自定义启动器
> 1. 分页
>
> > 如果查询1001页,每页10条记录
> >
> > 1. 先计算offset =(1001-1)*10 =10000
> >
> > 2. limit 10000,10
> >
> > 
目标:
定义一个启动器,向容器注入一个Bean( 生成token 验证token ..... ) TokenTemplate
向容器注入spring mvc拦截器,用于拦截token 并验证,验证通过后 ,将用户信息存储线程上下文
### 第一步 必须的依赖
~~~xml
org.springframework.boot
spring-boot-autoconfigure
~~~
### 第二步 创建自动配置类
~~~java
~~~
### 第三步 创建Properties文件,用于属性批量绑定
### 第四步 定义配置文件
保存自动配置类用
### 拦截器 自动配置类
1. 定义拦截器
2. 注册拦截器()
## 连接池
> 线程池 ---初始化一部线程 放到内存中 用的时候 取 用完放回去
### 介绍
#### 什么是数据源连接池?
简单来说,数据源连接池(Database Connection Pool)是一个**预先创建并管理数据库连接的容器**:
- 程序启动时,连接池会提前创建一定数量的数据库连接,存放在池中;
- 当程序需要访问数据库时,直接从池中获取连接,用完后归还(而非销毁);
- 连接池会自动管理连接的创建、复用、销毁,避免频繁创建 / 关闭连接的性能损耗。
#### 为什么需要连接池?
如果不使用连接池,每次数据库操作都要经历「创建连接→执行 SQL→关闭连接」的流程:
- 创建 / 关闭连接是**高开销操作**(涉及网络握手、权限验证等);
- 高并发场景下,频繁创建连接会导致数据库性能急剧下降,甚至出现连接数耗尽的问题。
#### 连接池的核心优势
1. **提升性能**:复用连接,避免频繁创建 / 销毁的开销;
2. **控制连接数**:防止过多连接压垮数据库;
3. **统一管理**:支持连接超时、空闲回收、故障重连等功能。
### druid
## 日志
> 面试:你们线上如何排查问题?
>
> 查看日志
>
> 你们用的什么命令怎么查的?(linux)\
>
> 假如 有一个300M的日志文件 如何快速查询 ?
### java中如何记录日志?
* 日志门面 (抽象日志 接口) SLF4J
* 日志实现 lobback(springboot默认使用的) log4j2(异步日志) jul (jdk内置 )
### 日志搭配
实际项目中需组合 “门面 + 实现”,核心推荐组合按优先级排序:
1. **SLF4J + Logback**:中小型项目首选,轻量、配置简单、性能足够,无额外兼容问题(原生适配)。
2. **SLF4J + Log4j2**:中大型分布式项目首选,异步日志性能优异,支持高并发、大日志量场景,适合微服务、分布式系统。
### 日志级别
#### 日志级别

#### 输出目标
* 控制台 开发用
* 文件 生产环境
* 大型 的 ELK elasticsearch(分布式搜索 查询快) logstash/filebeat (收集日志) kibana (显示)
* kafka ---日志记录 mq
#### 格式

~~~
%d{yyyy-MM-dd HH:mm:ss, SSS} %-5level %thread %class : %message
~~~
### 记录日志
1. 在目标类中 获取日志记录器
~~~java
//手动定义日志记录器
private final Logger logger = LoggerFactory.getLogger(UserController.class);
2. 通过注解实现
~~~java
@RestController
@Slf4j// 日志注解
public class UserController {
@GetMapping("/user")
public String getUser() {
log.info("查询用户");//直接使用log对象
return "getUser";
}
}
~~~
## 安全
权限管理:
> 1. 功能权限
>
> > 你能看到哪些页面?能够操作哪些按钮。
> >
> > 分为两种实现:
> >
> > 1. 前端实现 体现用户能操作的
> >
> > 2. 后端 api 用于限制用户能访问的资源
> >
> >
>
> 2. 数据权限
### 权限
通常是菜单管理:
* 一级菜单 分组管理 目录
* 二级菜单 页面 菜单
* 三级权限 按钮权限
### RBAC
涉及表:
* 用户表---角色 一对多
* 权限表---菜单表
> 权限标识: 模块:菜单:功能
* 角色表 ---权限的集合
* 角色--权限表
customer:customer:query@customer:customer:insert@customer:customer:update@customer:customer:delete@customer:contact:query@customer:contact:add
~~~vue
perminoss="customer:customer:query@customer:customer:insert@customer:customer:update@customer:customer:delete@customer:contact:query@customer:contact:add"
~~~
## 安全框架
思路:
1. 登录 成功后 ,加载用户的权限
> * 将权限 加入到token ------请求时拦截token 解析权限 --存储到SecurityContext
> * 将权限存储到服务器(内存/redis)-----拦截token 解析出用户信息 ---根据用户id 查找对应权限 存储到SecurityContext
2. 用户请求时 (除了登录) 拦截token ----有效----解析权限 存储到上下文中-----有 权限才可以访问
# 作业
参照若依权限系统,实现用户 角色 菜单 相关的接口实现