SpringBoot

总体特性:

打的是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对不同的线程是隔离的, 也就是说不同的线程的存储和获取是互不干扰的.

关于分页查询:

分页插件的工作原理

  1. 拦截SQL查询
    • 分页插件通过拦截器(Interceptor)机制拦截SQL查询。
    • 在执行SQL查询之前,插件会修改原始的SQL语句,自动添加分页条件,如LIMITOFFSET(或类似的数据库特定分页语法)。
  2. 添加分页条件
    • 插件根据当前页码(pageNum)和每页显示的条数(pageSize)计算OFFSETLIMIT的值。
    • OFFSET通常等于(pageNum - 1) * pageSize,而LIMIT等于pageSize
    • 这些值被添加到SQL语句的末尾,以限制查询结果的数量和起始位置。
  3. 执行修改后的SQL
    • 数据库执行修改后的SQL语句,返回分页后的结果集。
  4. 封装分页结果
    • 插件将查询结果封装到分页结果对象中(如PageHelper的PageInfo对象或MyBatis-Plus的IPage对象)。
    • 这些对象包含分页信息,如当前页码、每页显示的条数、总记录数、总页数等。

请求方式:

同一路径通过不同的请求方式也可以定位到不同的方法上.但是关于请求方法的相关信息还不清楚

文件上传:

令牌主动失效机制:

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中指定激活的配置文件就是根据-后面的名字来指定的

相关推荐
spencer_tseng1 小时前
gradle eclipse [.project .classpath .settings]
java·ide·eclipse·gradle
VinfolHu1 小时前
【JAVA】数据类型与变量:深入理解栈内存分配(4)
java·开发语言
有梦想的攻城狮3 小时前
spring中的@Configuration注解详解
java·后端·spring·configuration·配置类
言之。3 小时前
Go语言中的错误处理
开发语言·后端·golang
red_redemption3 小时前
Spring Boot + MyBatis-Plus 的现代开发模式
java·spring boot·mybatis
苹果酱05673 小时前
iview内存泄漏
java·vue.js·spring boot·mysql·课程设计
Kay_Liang3 小时前
探究排序算法的奥秘(下):快速排序、归并排序、堆排序
java·数据结构·c++·python·算法·排序算法
forestsea4 小时前
Java Class类文件结构
java·开发语言
xun-ming4 小时前
Java导出带图片的Excel
java·excel·easypoi·导出·excel带图片
24k小善4 小时前
Flink维表深度解析
java·大数据·flink·云计算