(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
注解的基本使用如下:
-
在需要进行条件判断的类上添加
@Conditional
注解。 -
将
@Conditional
注解中传入一个实现了Condition
接口的类,该类会根据具体的条件返回一个布尔值。 -
当满足条件时,
@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, 10
和 LIMIT 10
,它们之间是有区别的
-
LIMIT 1, 10
:从结果集中的第 2 行开始(因为 MySQL 中的行号从 0 开始),返回接下来的 10 行数据。也就是跳过第一行,返回第 2 行到第 11 行的数据。 -
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请求的发送和响应处理过程。
具体代码实现可以参考下面的示例:
- 使用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响应状态码之一,表示服务器无法处理请求中所包含的媒体类型。即,客户端发送的请求中包含了服务器不支持或不理解的媒体类型。
这个错误通常发生在以下情况:
- 请求的Content-Type(即请求头中的Content-Type字段)指定的媒体类型不被服务器支持。
- 请求的媒体类型无法正确解析或识别。
- 当前服务器配置的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¶m2=value2'