总体特性:
打的是jar包,在浏览器中输入地址的时候不需要项目名,直接在8080后面写控制器的RequestMapping即可
例如: http://localhost:8080/hello

maven配置文件中要引入父工程,并写明版本号, 然后在依赖中添加起步依赖,这是不需要知名版本号,父工程会管理版本号.
启动类的名字一般是当前工程名加上Application
tomcat默认的端口号是8080, 虚拟路径是空"". 这些可以在配置文件中修改
yml配置文件中的层级关系是通过换行和缩进来表示的
yml格式的配置文件相较于properties格式来说它的层次更加清晰, 更加注重数据. 使用更加广泛
yml也可以配置数组:
html
hobbies:
- 打篮球
- 打乒乓球
- 钓鱼
关于Mybatis的整合:
添加整合Mybatis起步依赖, 这样就会导入Mybatis和整合相关的所有依赖, 而且不需要自己去配置数据源,Bean工厂等,只需要在配置文件中配置数据源的信息即可
再导入数据库的驱动依赖
使用这个springboot开发web项目的mapper层对应原本使用ssm开发web项目的dao层, mapper层只有接口, 接口用mapper注解声明, 在方法上方通过注解写出要执行的SQL语句:
关于service层和ssm目前所看没有区别:
Bean的管理:

启动类上的注解整合了ComponentScan, 但是没有指定扫描的包路径, 默认会扫描启动类所在的包及其自子包. 如果想指定扫描的包路径,可以使用注解@ComponentScan(basePackage="...")放在@SpringBootApplication注解的上面:
java
@Component(basePackage="...")
@SpringBootApplication
Bean的注册:
导入第三方Bean的方法(不是自己定义的): 1. @Bean 2. @Import
@Bean的注解方式(引入jar包中的类):
1.不建议放在启动类中声明

2.更常用的一种方式, 将要导入的类放入配置类中声明:
在使用ApplicationContext对象获取Bean时有两种方法: 1给getBean传入对象的class, 2.是传入返回这个Bean对象的方法名, 方法民也可以在@Bean中指定, 不过默认是方法名更好一点
如果方法的内部需要IoC容器中的某个Bean,只需要在方法的参数列表中声明即可, SpringBoot会自动注入,这和使用方法名获取实例有点相辅相成的感觉.
使用@Import的方式:

当@Import一个配置类时,配置类其中的@Bean实例也会加入到IoC容器中
@Import可以导入一个配置类的数组,但是那样太臃肿
更好的方式是实现一个ImportSelector接口, 在接口中重写selectImport方法, 在启动类中只需要@Import这个接口实现类的class文件即可,SpringBoot会自动调用这个方法,然后将返回值指定的配置文件中的Bean加载到IoC容器中. 下面是一个接口实现类的实例, 在实际开发中回见这些配置文件的全路径放在一个配置文件中,然后在方法中读取这个配置文件(配置文件中一行表示一个配置类的全限定名),最后返回

注解组合:
最后在@Import(接口实现类的class文件)这点上可以优化: 定义一个新的组合注解, @ApplicationSpringBoot也是一个组合注解, 这样:
第一个注解说明这个注解可以在类上来使用, 第二个说明注解的使用期间是运行期间
这样的话在启动类上关于@Import的注解就只需要写: @EnableCommonConfig 例如:

看起来就会很装逼(优雅)吧.
用来判断注册条件的注解:
常用的三个:

当我们需要向Bean中注入属性时, 可以使用@Value注解来指定获取配置文件application.yml中的值

但是上述这种方法,如果没有找到配置文件中指定的值,就会报错, 这时可以使用
这种注解的方式: @ConditionalOnbProperty(prefix="county", name={"name", "system"})
如果能在配置文件中找到指定的值,就将Country这个Bean注入进IoC容器中, 否则不注入, 任何使用了这个Bean的地方都会报错

注解@ConditionalOnMissingBean(Country.class): 如果IoC容器中存在Country,则不注入Province,否则注入Province
如果当前引入了web的起步依赖, 则环境中有DispatcherServlet类,否则没有.注意这个是环境不是IoC容器

自动配置:
源码解析:

如果maven工程默认的jdk版本太低,则可以在pom中配置编译的插件:
自定义starter:
在starter中引入自动配置模块时,最好也要引入自动配置模块所添加的依赖(官方建议)
Spring Validation框架:

异常处理: 写一个全局异常处理器来处理参数校验失败的异常
属性校验:
只有第二步,这个属性注解才能生效
分组校验:

自定义校验:

1. @Controller
注解
-
作用:用于标记一个类为 Spring MVC 的控制器,处理 HTTP 请求。
-
返回值 :
- 默认情况下,
@Controller
返回的是一个视图名称(View Name),Spring 会根据视图名称解析为具体的视图(如 JSP、Thymeleaf 等)。 - 如果需要返回 JSON 或其他格式的数据,需要配合
@ResponseBody
注解使用。
- 默认情况下,
-
适用场景 :适用于传统的 Web 应用,返回 HTML 页面或视图
2.
@RestController
注解 -
作用 :
@RestController
是@Controller
和@ResponseBody
的组合注解,专门用于构建 RESTful Web 服务。 -
返回值 :
- 默认情况下,
@RestController
返回的是 JSON 或 XML 格式的数据,而不是视图名称。 - 不需要显式使用
@ResponseBody
注解。
- 默认情况下,
-
适用场景:适用于构建 RESTful API,返回 JSON 或 XML 数据
JWT令牌:

引入的依赖:

生成令牌和验证令牌的test:
登录认证:
写一个拦截器类,用于登录认证, 然后写一个配置类将这个拦截器类注册进去, 并将登录和注册页面排除.
ThreadLocal:
如果使用完不释放的话可能发生内存泄露
一般是在拦截器的pre方法中添加, after中释放.
ThreadLocal对不同的线程是隔离的, 也就是说不同的线程的存储和获取是互不干扰的.
关于分页查询:
分页插件的工作原理
- 拦截SQL查询 :
- 分页插件通过拦截器(Interceptor)机制拦截SQL查询。
- 在执行SQL查询之前,插件会修改原始的SQL语句,自动添加分页条件,如
LIMIT
和OFFSET
(或类似的数据库特定分页语法)。
- 添加分页条件 :
- 插件根据当前页码(pageNum)和每页显示的条数(pageSize)计算
OFFSET
和LIMIT
的值。 OFFSET
通常等于(pageNum - 1) * pageSize
,而LIMIT
等于pageSize
。- 这些值被添加到SQL语句的末尾,以限制查询结果的数量和起始位置。
- 插件根据当前页码(pageNum)和每页显示的条数(pageSize)计算
- 执行修改后的SQL :
- 数据库执行修改后的SQL语句,返回分页后的结果集。
- 封装分页结果 :
- 插件将查询结果封装到分页结果对象中(如PageHelper的
PageInfo
对象或MyBatis-Plus的IPage
对象)。 - 这些对象包含分页信息,如当前页码、每页显示的条数、总记录数、总页数等。
- 插件将查询结果封装到分页结果对象中(如PageHelper的
请求方式:
同一路径通过不同的请求方式也可以定位到不同的方法上.但是关于请求方法的相关信息还不清楚
文件上传:


令牌主动失效机制:

Redis有优化用户登录:
原本的用户登录验证,也就是拦截器的工作方式是使用JWT的验证方法通过头部和载荷生成的签名与传来的token比较来判断是否放行, 而由于token的时效性,所以在用户更改密码之后,原本登录返回的token可能仍处于生命周期内,也就是说拦截器还会对旧的token放行,这是比较危险的.可以利用Redis来解决这个问题:
1.项目整合Redis
2.启动Redis服务
3.在用户登录成功后将生成的token保存在Redis中, 在用户更改密码后侯更新在Redis中保存的token
4.在拦截器中要判断浏览器发送的token是否保存在Redis中,如果存在则放行, 否则抛出异常
这样利用Redis来时刻存储当前密码对应的token就解决了这个问题
因为每次访问都需要通过拦截器, 对Redis中的token的查询也比较频繁,这样就体现了Redis的优势.
SpringBoot项目部署:


SpringBoot属性配置:
运维是无法修改源码的,可以通过以下方式来修改配置


当项目启动时会自动读取环境变量中的变量
当环境变量修改之后, cmd运行窗口需要重新启动一个才能生效

在jar包所在目录下写一个yml配置文件, springboot会自动读取这个配置文件

从上往下依次变高
多环境开发:


如果通用信息和特定环境下的配置有冲突, 则特定环境下的配置生效
为每个运行环境写一个配置文件, 然后在项目读取的配置文件中激活指定环境, 注意这些配置文件的命名,为application-dev/test/pro, 在application.yml中指定激活的配置文件就是根据-后面的名字来指定的