# 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 > > > > ![image-20260225153109413](assets/image-20260225153109413.png) 目标: 定义一个启动器,向容器注入一个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**:中大型分布式项目首选,异步日志性能优异,支持高并发、大日志量场景,适合微服务、分布式系统。 ### 日志级别 #### 日志级别 ![image-20260227101018624](assets/image-20260227101018624.png) #### 输出目标 * 控制台 开发用 * 文件 生产环境 * 大型 的 ELK elasticsearch(分布式搜索 查询快) logstash/filebeat (收集日志) kibana (显示) * kafka ---日志记录 mq #### 格式 ![image-20260227102142291](assets/image-20260227102142291.png) ~~~ %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 ----有效----解析权限 存储到上下文中-----有 权限才可以访问 # 作业 参照若依权限系统,实现用户 角色 菜单 相关的接口实现