spring boot的笔记(记录在学习spring boot框架时遇到的一些常见问题)

(1)、在Spring中,如果一个类被定义为Bean,但是这个类中只有有参构造函数,没有无参构造函数。

(那么在spring boot项目启动时,扫描到这个Bean时,spring boot项目就会报错,无法启动,因为spring默认的构建Bean方式为无参构造。)并且使用@Autowired注解进行自动装配时,是不能成功的。

@Autowired注解默认使用的是byType的方式进行自动装配,它会根据类型来查找匹配的依赖对象进行注入。当一个类只有有参构造函数时,Spring无法通过无参构造函数实例化该类对象,也无法通过byType的方式找到合适的依赖对象进行注入,因此会抛出异常。

解决这个问题的方法是,可以在该类中显式地定义一个无参构造函数。这样,即使该类中只有有参构造函数,Spring也可以通过无参构造函数实例化该类,并使用@Autowired注解注入其他依赖。

另外,如果该类中只有有参构造函数,并且无法或不想为其显式地定义一个无参构造函数,可以考虑使用其他方式进行依赖注入,例如使用@Resource或者@Inject注解等。这些注解可以指定使用哪个构造函数或者哪个方法进行依赖注入,从而避免由于缺少无参构造函数而导致的问题。

(2)、Spring Boot官方推荐的自动装配方法是使用@Autowired注解进行依赖注入。@Autowired可以用于构造函数、字段、Setter方法或者其他自定义方法上,以实现自动装配。官方推荐方式是构造函数。

(3)、@RestControllerAdvice 是一个 Spring Framework 中的注解,它表示一个类用于全局处理异常和返回值,类似于 @ControllerAdvice 但是专门用于 RESTful 应用程序中的控制器。

使用 @RestControllerAdvice 注解的类通常包含多个方法,这些方法使用了不同的异常处理注解,如 @ExceptionHandler、@InitBinder 和 @ModelAttribute。这些注解用于处理不同类型的异常和请求参数绑定问题,并将它们转化为适当的 HTTP 响应或者模型数据。

@RestControllerAdvice 可以与 @ControllerAdvice 一起使用,但其作用仅限于处理 RESTful 应用程序中的控制器。当处理控制器中出现的异常或者错误时,我们可以使用 @RestControllerAdvice 提供一个全局的异常处理方案。例如,我们可以通过返回一个特定格式的 JSON 消息告诉客户端发生了异常,并提供适当的响应码。

总之,使用 @RestControllerAdvice 注解的类是一个全局性的异常处理器,它可以捕获控制器中的异常并提供特定的响应。它适用于 RESTful 应用程序,并与 Spring Framework 的其他注解协同工作,提供更好的异常处理和统一的响应。

(4)、在使用QueryWrapper时,第一个参数应该写数据库中的字段名,而不是实体类中的字段名。

QueryWrapper是MyBatis-Plus提供的一种查询构造器,用于构建查询条件。当你使用eq方法时,第一个参数应该是数据库表中的列名,而不是实体类中的属性名。

具体来说,QueryWrapper会将数据库表中的列名与实体类中的属性名进行映射。因此,你应该使用数据库表中的列名作为eq方法的第一个参数。

(5)、在Java中,使用throw new Exception()语句可以手动抛出一个异常。当执行到这个语句时,程序会立即停止当前的执行流程,并且异常会沿着调用栈向上抛出,直到被捕获或者程序终止。

如果异常被捕获并进行处理,程序可以继续执行后续的代码。但是如果异常没有被捕获,或者异常类型不是程序中任何一个catch块所能捕获的,那么程序会终止运行,并且在控制台输出异常的相关信息。

(6)、在Minio中可以创建不同的桶来专门存放那些不同的文件类型,以便于文件的整理和下载。

在桶的内部,还可以创建不同的文件夹来对文件进行区分。

(7)、

@Conditional 是 Spring Framework 中的一个注解,它可以用来动态地控制 Spring 应用程序中的 Bean 的创建。

@Conditional 注解的基本使用如下:

  1. 在需要进行条件判断的类上添加 @Conditional 注解。

  2. @Conditional 注解中传入一个实现了 Condition 接口的类,该类会根据具体的条件返回一个布尔值。

  3. 当满足条件时,@Conditional 标注的类上的 Bean 会被创建,否则不会被创建。

例如,假设我们有一个名为 MyBean 的 JavaBean 类,在启动 Spring 应用程序时,我们需要根据不同的条件来决定是否创建该 Bean。我们可以这样使用 @Conditional 注解:

@Configuration
public class MyConfig {

    @Bean
    @Conditional(MyBeanCondition.class)
    public MyBean myBean() {
        // 创建 MyBean 实例
        return new MyBean();
    }
}

在上面的代码中,使用 @Conditional 注解标注了 myBean() 方法,并传入了一个 MyBeanCondition 类型的参数。这个 MyBeanCondition 类实现了 Condition 接口,其中的 matches() 方法返回一个布尔值,表示是否应该创建 MyBean 实例。

例如,我们可以定义 MyBeanCondition 类如下:

public class MyBeanCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 根据具体条件返回布尔值
        // 如果满足条件,返回 true,否则返回 false
        return someCondition();
    }

    // 具体的条件判断逻辑
    private boolean someCondition() {
        // ...
    }
}

上面的 MyBeanCondition 类实现了 Condition 接口,并在其中实现了 matches() 方法来进行具体的条件判断。 当 matches() 方法返回 true 时,MyBean 实例会被创建;当 matches() 方法返回 false 时,MyBean 实例不会被创建。

这样,我们就可以使用 @Conditional 注解来动态控制 Spring 应用程序中的 Bean 的创建。

(8)、反射:

获取对象的三种方式:

1、类名.class

2、对象.getClass()

3、Class.forName("全类名的路径")

自动配置:

  遵循约定大于配置的原理,在spring boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器

(9)、在 Java 中,JSON 数组通常对应于 List 集合。JSON 是一种数据交换格式,它可以表示数组、对象、字符串、数字、布尔值和 null 值。而在 Java 中,List 是一种集合类型,用于存储一组元素。

(10)在 MySQL 中,LIMIT 关键字用于限制查询结果的返回行数。LIMIT 子句通常采用两个参数的形式:LIMIT offset, count,其中 offset 是起始位置,count 是要返回的行数。

对于你提到的 LIMIT 1, 10LIMIT 10,它们之间是有区别的

  1. LIMIT 1, 10:从结果集中的第 2 行开始(因为 MySQL 中的行号从 0 开始),返回接下来的 10 行数据。也就是跳过第一行,返回第 2 行到第 11 行的数据。

  2. LIMIT 10:等同于 LIMIT 0, 10,表示从结果集中的第 1 行开始,返回 10 行数据。这里省略了 offset 参数,默认起始位置为 0。

因此,这两种写法的区别在于起始位置的设定。在实际使用中,根据具体需求来选择使用哪种写法。

(11)git的使用:

            Git的三种文件状态
已修改(modified):表示修改了文件,但还没保存到数据库中。
已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交(committed):表示数据已经安全地保存在本地数据库中。


          Git的三个阶段
工作区是对项目的某个版本独立提取出来的内容。
暂存区是一个文件,保存了下次要提交的文件列表信息。
Git目录是Git用来保存项目的元数据和对象数据库的地方。


               Git的工作流程
在工作区修改文件。
如果你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
提交更新,找到暂存区的文件,将快照永久性的存储到Git目录。
 

(12)分页:

MySQL的分页语句 select * from limit  1,5

表示偏移量为1(偏移量从0开始,偏移量为0,表示第一行(这时可以省略不写)偏移量为1,表示从第二行开始)

每页大小为5

MP封装的分页方法或许PageHelper插件封装的PageHelper.startPage都只需要传入

当前页(page)和每页大小(size)它们会自动封装为偏移量【(page-1)*size】和每页大小的

PageHelper插件要设置一些参数才能更好的使用

# PageHelper 分页插件配置
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countsql
 

helper-dialect:  指定数据库,不指定的话会默认自动检测数据库类型
reasonable:   是否启动分页合理化。如果启用,当 pagenum < 1 时,会自动查询第一页的数据,当 pagenum > pges 时,自动查询最后一页数据;不启用的,以上两种情况都会返回空数据,如果启用则 pageHelper可以自动拦截请求参数中的 pageNum,pageSize参数,否则需要使用 PageHelper.startPage(pageNum,pageSize) 方法调用。
support-methods-arguments:  默认为 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
params:       用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

(13)、

当涉及到商业模式时,B2C和B2B2C是两种常见的模式。

B2C模式(Business to Consumer)是指企业直接向最终消费者销售产品或提供服务的商业模式。在B2C模式中,企业通过各种渠道(如电子商务网站、移动应用程序、实体店铺等)直接与个人消费者进行交互。这种模式下,企业需要关注消费者需求、提供良好的用户体验以及进行市场营销活动,以吸引消费者并建立长期的客户关系。

B2B2C模式(Business to Business to Consumer)是指企业通过与其他企业合作,间接向最终消费者销售产品或提供服务的商业模式。在B2B2C模式中,企业(B2B)与其他企业(B2B)建立合作伙伴关系,将产品或服务提供给这些合作伙伴企业。然后,这些合作伙伴企业(B2B2C)将产品或服务再次提供给最终消费者(C)。这种模式下,企业需要与合作伙伴企业紧密合作,共享资源和专长,以提供更全面、更具竞争力的产品或服务。同时,企业的品牌和声誉对于合作伙伴企业在市场中的表现非常重要。

总结来说,B2C模式是企业直接面向最终消费者销售产品或提供服务,而B2B2C模式是企业通过与其他企业合作,间接向最终消费者销售产品或提供服务。两种模式都有各自的优势和适用场景,企业可以根据自身的业务需求和市场情况选择适合的模式。

(14)

在Java中,可以使用以下几种方式发送HTTP请求:

1. 使用JDK自带的java.net包:可以通过URLConnection或者HttpURLConnection类来发送HTTP请求,通常会比较底层,需要自己处理一些较为复杂的细节。

2. 使用第三方库Apache HttpClient:该库是Apache软件基金会开源的一个HTTP客户端库,功能强大,易于使用,支持HTTP协议的多个版本和方法,并且具有连接池、认证、重试等特性。

3. 使用Spring框架的RestTemplate:RestTemplate是Spring提供的一个用于访问REST服务的模板类,它封装了HTTP请求过程,提供了便捷的API,可以简化HTTP请求的发送和响应处理过程。

具体代码实现可以参考下面的示例:

  1. 使用RestTemplate发送GET请求
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://example.com", String.class);
System.out.println(result);

2、使用HttpCLient发送Post请求:

HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost postRequest = new HttpPost("http://example.com");
StringEntity input = new StringEntity("{\"qty\":100,\"name\":\"iPad 4\"}");
input.setContentType("application/json");
postRequest.setEntity(input);

HttpResponse response = httpClient.execute(postRequest);
BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));

String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
    System.out.println(output);
}
httpClient.getConnectionManager().shutdown();

(15)knife4j:不同版本常用注解的比较;

(16):

当使用MyBatis框架进行持久层开发时,通常需要创建Mapper接口来定义数据库操作方法。在过去,我们需要为每个Mapper接口编写对应的XML映射文件,以及手动实现接口中的方法。这样会导致代码冗余和维护成本增加。

为了简化Mapper接口的创建和使用,MyBatis 3.4.0版本引入了@Mapper注解。使用@Mapper注解的接口会被MyBatis自动注册为Mapper组件,无需再编写XML映射文件,也无需手动编写Mapper接口的实现类。

具体而言,@Mapper注解的作用包括以下几点:

1. 标识接口:@Mapper注解标识一个接口是MyBatis的Mapper接口,用于定义数据库操作方法。
2. 自动注册:使用@Mapper注解后,MyBatis会在运行时动态地为这个接口生成代理对象,并注册到MyBatis的配置中,使得我们可以直接调用接口中定义的方法来进行数据库的操作。
3. 无需XML映射文件:@Mapper注解省去了编写XML映射文件的步骤,使得开发者能够更加便捷地进行数据库操作。

总之,@Mapper注解使得MyBatis框架能够自动注册Mapper接口并动态生成实现类,从而简化了持久层开发的流程,降低了代码量,提高了开发效率。

@Mapper注解定义的接口可以被加入到IOC容器中,但是idea的编译不出来。这时,使用@Autowired注解注入UserMapper就会爆红;但是不影响使用,要使不爆红,有三种方法:

1、不管它,不影响正常使用UserMapper

2、在UserMapper上加入@Repository,将这个接口定义为bean

3、更改idea的预编译方法,将这个爆红改为警告。

@Repository和@Mapper的异同
@Mapper是属于mybatis的注解。在程序中,mybatis需要找到对应的mapper,在编译时候动态生成代理类,实现数据库查询功能。
@Mapper和@Repository注解的使用方式一样,都是在持久层的接口上添加注解。
但是如果只是单独的使用@Mapper注解的话,在idea中进行自动装配的时候,会出现警告,提示找不到这个bean。但是这个不影响程序运行,可以直接忽略。
想要不出现这个警告,可以在idea设置中对这种警告进行忽略,也可以在使用@Mapper的地方同时使用@Repository注解。这样spring会扫描@Repository并识别这个bean,就不会出现这个警告。

正常情况下的使用,我们都是使用@Mapper居多,而不使用@Repository注解。
不使用@Repository注解,而实现注入这个接口的实现类主要有以下3种方法:
1、在spring的配置文件中,配置了MapperScannerConfigure这个bean,他会扫描持久层接口创建实现类交给spring来管理。
2、接口使用@Mapper注解。
3、springboot的启动类上使用@MapperScan注解,和MapperScannerConfigure的作用一样。

(17):spring security(登录认证与权限校验)

登录认证:

权限校验:

用户认证之后,会去存储用户对应的权限,并且给资源设置对应的权限,spring security支持两种粒度的权限;

1、基于请求的:再配置文件中配置路径,可以使用**的通配符

2、基于方法的:再方法上使用注解实现。

(3)、动态权限:用户权限被修改之后,不需要用户退出,会自动刷新,也不需要修改代码。

(18):

MySQL整合sql文件时遇到的错误:

[HY000][1273] Unknown collation: 'utf8mb4_0900_ai_ci'

这个错误是因为你的数据库版本不支持使用 `utf8mb4_0900_ai_ci` 这个字符集和校对规则(collation)。

在MySQL 5.7.7及以上的版本中,`utf8mb4_0900_ai_ci` 是默认的字符集和校对规则,但低于此版本的MySQL可能不支持该规则。

有两种解决方法:

1. 将 `utf8mb4_0900_ai_ci` 替换为你的MySQL版本所支持的字符集和校对规则。你可以通过执行以下命令查看你的MySQL版本所支持的字符集和校对规则:

  
   SHOW COLLATION;
   

   找到合适的字符集和校对规则,然后将 `CREATE TABLE` 语句中的 `utf8mb4_0900_ai_ci` 替换为你选择的字符集和校对规则。

2. 更新你的MySQL版本至5.7.7或以上。在更新之前,请备份你的数据库以确保数据安全。

请根据你的具体情况选择适合的解决方法。如果你有任何其他问题,请告诉我。

73] Unknown collation: 'utf8mb4_0900_ai_ci'

(19)springbooot 拦截器:

如果需要在一个HTTP请求处理前后进行一些处理工作,那么拦截器将会非常有用。

创建一个自定义拦截器,实现HandlerInterceptor接口。

HandlerInterceptor接口有三个方法:

perHandle:在controller处理之前进行调用;

postHandle:在controller处理之后调用,在return 数据之前

afterCompletion:在整个请求处理完成之后被调用

postHandle和afterCompletion被调用的前提是perHandle方法返回true

实现一个WebMvcConfigurer接口,并重写addInterceptor方法。

(20):HTML的表单请求

HTML中的form表单默认情况下会将数据格式化为key-value形式,而不是JSON格式。如果需要以JSON格式提交数据,可以借助JavaScript来实现。

前端直接发送请求的话,如果传入的参数类型与后端接收的类型不匹配。

那么就会直接报错误。415

415是HTTP响应状态码之一,表示服务器无法处理请求中所包含的媒体类型。即,客户端发送的请求中包含了服务器不支持或不理解的媒体类型。

这个错误通常发生在以下情况:

  1. 请求的Content-Type(即请求头中的Content-Type字段)指定的媒体类型不被服务器支持。
  2. 请求的媒体类型无法正确解析或识别。
  3. 当前服务器配置的MIME类型列表不包含请求中的媒体类型。

要解决这个问题,你可以检查请求头中的Content-Type字段是否正确,并确保服务器支持该媒体类型。你也可以尝试使用另一个媒体类型,或者更新服务器的MIME类型配置以支持请求中的媒体类型。

(21)、git相关:

提交、推送、拉取是Git工作机制中的环节,分别是将代码提交到本地仓库,本地仓库中保存修改的各个历史版本;然后将代码推送到远程仓库;在此之前,如果我们的本地代码不是最新版本的,就需要先从远程仓库将代码拉取下来到本地库,如果有冲突需先解决冲突然后在重新推送到远程库。

而我们在开发中可能会遇到多个分支,比如主分支master,开发分支develop等,但一般不会在主分支上进行开发,而是我们自己单独的从主分支或者开发分支中分出来一条分支,比如test分支,然后在test分支上进行代码开发。在我们开发完成后,就需要进行分支合并到我们的主分支上。在进行分支合并的时候常常会出现Git版本冲突,出现冲突的原因是,多人协同开发项目时,两个开发者对同一个文件同一个位置做出了不同的内容修改,因此就发生了冲突。解决冲突的办法是对其冲突部分进行手动修改;大致可以分为三个步骤,分别是寻找冲突,修改冲突,提交修改后的冲突文件。

一般发生冲突的场景会出现在分支合并和代码拉取两个环节。

git版本冲突产生的原因:

所谓冲突指的就是,两个开发者对同一个文件同一个位置做出了不同的内容修改,然后在进行分支合并时或者是从远程仓库拉取代码到本地库时,就会产出冲突报错;两个不同的版本,导致git不知道要接受那个。

如何解决git版本冲突?
对冲突的文件手动进行修改;

1.寻找冲突
首先要找到出现冲突的位置,通过git merge 分支名 如果有冲突的话会提示那些文件有冲突。

2.修改冲突
我们可以直接在电脑中找到冲突文件对比差异,然后进行手动修改为正确的;如果使用命令的话,使用 cat 冲突文件查看不同分支代码的差异,然后 vim 进入冲突文件进行删除修改正确代码。

3.提交修改后的冲突文件
分别执行命令git add 添加到暂存区;git commit -m 提交到本地库;最后git push推送到远程库就可以了。
(22):启动redis的时候,redis-cli -a 123456 --raw  在启动命令后加上--raw  就可以查看在redis客户端查看中文了,注入redisTemplate时,可以用@Autowired注解来进行注入,这样在进行存入时redis客户端就不会在key前面加上一些前缀了。

(23):在yml配置 文件中,使用@{}@

就可以在{}中引入maven的pom文件中的信息了

(24):索引是帮助MySQL高效获取数据的排好序数据结构

(25) 要在使用了spring security的项目中使用knife4j进行测试,那么,需要放行knife4j的四个资源路径;

主要是这四个路径:



/doc.html
/webjars/**
/v3/**
/swagger-resources/**

(26)在使用axios发送请求时,如果要携带请求参数,那么,请求参数的类型一定要是一个对象类型:

return api({
    url: "sys/resetPassword",
    method: "get",
    params: email
});

在这里,email要是一个队象类型而不是一个基本类型(int String)等,

也可以写成

 params: 'param1=value1&param2=value2'

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张乔24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值