天天看点

简述遇到的一些问题如果出现could not autowire there is more than one bean

serialVersionUID的用处

Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。

在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。

自动生成 serialVersionUID的方法

编写类,同时在类中创建属性和方法,

idea工具栏中点击"File"按钮,在弹出的菜单中选择“Settings”选项。

弹出Settings弹框后,在搜索栏“Inspections”选项。

右侧列表中选择“Serialization issues”并勾选该条目的所有选项,勾选完成后并点击“Ok”按钮

选中类名称Blog,按Alt+Enter快捷键。下拉弹框中找到“Add 'serialVersionUID' field”选项并点击该选项

enum的用法:

public enum MyColor {
    
    RED(0), BLUE(1);
    
    private Integer code;

    MyColor(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
}
           

初始化和获取值的方法

public class HaloApplication {                                       
                                                                     
	public static void main(String[] args) {                         
                                                                     
		MyColor AColor = MyColor.valueOf("RED");                     
		MyColor BColor = MyColor.BLUE;                               
                                                                     
		int temp = BColor.getCode();                                 
                                                                     
		String tempColor = AColor.name();                            
                                                                     
		System.out.println(temp+" "+tempColor);                      
		SpringApplication.run(HaloApplication.class, args);          
                                                                     
	}                                                                
                                                                     
}                                                                    
           

MD5加密

message-digest algorithm 5 

信息摘要算法

特点

长度固定: 不管多长的字符串,加密后长度都是一样长 

           作用:方便平时信息的统计和管理

2.易计算:

字符串和文件加密的过程是容易的. 

作用: 开发者很容易理解和做出加密工具

3.细微性

一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变. 

作用:很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动.

4.不可逆性

无法反向计算出原密码. 

跨域过滤器CORSFilter

当一个资源从与该资源本身所在的服务器不同的域或端口不同的域或不同的端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

CORS的提出主要为识别跨域请求的标准化,推动互联网向前发展。

CORS原理

从浏览器脚本方面:通过严格控制交换数据的类型来允许跨域请求。除非是由XHR作者发起的特定请求,且允许跨域web服务,否则 Cookies等数据将被锁。如此就减轻了数据泄露的风险。

从web Service的方法:利用浏览器报告的源URL,目标跨域web Service能够基于自己的源策略确定是否允许还是拒绝本次请求。

注意:

为使CORS正常工作,浏览器和web服务器必须都支持CORS机制。

CORS并不是致力于提供服务端的安全,浏览器提供源请求头,而服务器无法直接验证。

实现方式和属性解读

package com.zjf.halo.filter;

import org.springframework.http.HttpHeaders;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 *继承OncePerRequestFilter,
 *确保在一次请求只通过一次filter,而不需要重复执行
 */
public class CorsFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                    FilterChain filterChain) throws ServletException, IOException {


        /**
         * ACCESS_CONTROL_ALLOW_ORIGIN:取值范围{*|origin-list},默认*。*表示接受来自任何源的请求,
         * 而空格分隔的origin-list注意泪出CORS filter允许接受的请求源,
         * 如果请求源不再列表中,将获得HTTP 403 “Forbidden”响应。
         */

        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN,"*");

        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");

        /**
         *ACCESS_CONTROL_ALLOW_METHODS:取值范围{method-list},默认“GET, POST, HEAD, OPTIONS”。列举所支持的HTTP方法。
         * 该信息将通过“Access-Control-Allow-Methods”头信息返回给调用者,并且需要在service中实现CORS。
         * 非列表内的方法类型的请求将被CORS filters以HTTP 405 “Method not allowed”响应拒绝。
         */

        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTION");

        /**
         * ACCESS_CONTROL_ALLOW_CREDENTIALS:取值{true|false},默认true。
         * 提示所支持的用户凭据类型,如cookies、HTTP授权或客户端证书。
         * CORS Filter利用该值构造“Access-Control-Allow-Credentials”头信息。
         */

        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "false");

        /**
         * “Access-Control-Max-Age”头信息传递给浏览器。
         * 建议浏览器保存预检请求缓存1小时,即该属性值为3600.
         */

        httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");

        if(CorsUtils.isPreFlightRequest(httpServletRequest)){
            return ;

        }

        filterChain.doFilter(httpServletRequest,httpServletResponse);
    }
}
           

ModelAndView与Model

在前端向后台请求时,spring会自动创建Model与ModelMap实例,我们只需拿来使用即可

Model(org.springframework.ui.Model)

Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。

ModelMap(org.springframework.ui.ModelMap)

Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自己创建对象。

ModelMap对象主要用于把controller方法处理的数据传递到jsp界面,在controller方法中把jsp界面需要的数据放到ModelMap对象中即可。

ModelAndView(org.springframework.web.servlet.ModelAndView)

ModelAndView对象的两个作用:

(1) 设置url地址(这也是ModelAndView和ModelMap的主要区别),实现页面跳转。

(2) 把controller方法中处理的数据传到jsp页面,在controller方法中把jsp界面需要的数据放到ModelAndView对象中即可。然后return mv

JWT

JSON Web Token

相关概念

在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态、分布式的web应用授权

Token

相关概念

Token是一个字符串,是一段根据特殊规则生成的唯一的、保存在缓存服务器(如Redis)中的key,这个key对应的value是用户账户数据。每个用户登录后,服务器生成一个类似Token并缓存,之后用户每次请求中都要带上这个Token,以便实现类似于HTTP Session的会话跟踪。

Future 与FutureTask的区别

Future<V>接口

public interface Future<V> {  
        boolean cancel(boolean mayInterruptIfRunning);  
        boolean isCancelled();  
        boolean isDone();  
        V get() throws InterruptedException, ExecutionException;  
        V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;  
    }  
           

FutureTask类

public class FutureTask<V> implements RunnableFuture<V> {  }
           
public interface RunnableFuture<V> extends Runnable, Future<V> {  
        void run();  
    }  
           

FutureTask除了实现了Future接口外还实现了Runnable接口(即可以通过Runnable接口实现线程,也可以通过Future取得线程执行完后的结果),因此FutureTask也可以直接提交给Executor执行。

Spring Boot Configuration Annotation Processor not fount in classpath

https://blog.csdn.net/superbeyone/article/details/82876403

此时需要引入依赖

使用Maven时,依赖项应声明为可选

<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-configuration-processor</artifactId> 
	<optional>true</optional> 
</dependency>
           

@DynamicInsert

设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中

@DynamicUpdate

设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中

Lombok

引入Lombok不仅需要添加依赖,还需要idea中添加Lombok的插件

@Aspect注解

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

Thymeleaf和FreeMarker

@ResponseBody

这个注解通常使用在控制层(controller)的方法上,其作用是将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。

转发和重定向的应用场景

       转发是要比重定向快,因为重定向需要经过客户端,而转发没有。有时候,采用重定向会更好,若需要重定向到另外一个外部网站,则无法使用转发。另外,重定向还有一个应用场景:避免在用户重新加载页面时两次调用相同的动作。

如果出现could not autowire there is more than one bean

该错误不影响编译运行,相当于java里面的warning

alt+enter,加上suppress all warings即可去除

也可以通过修改idea配置settings->Inspections->Spring->Serverity 改为warning

参考链接

https://blog.csdn.net/mp624183768/article/details/80575843

https://blog.csdn.net/M100782530qrcord/article/details/79957075

https://www.cnblogs.com/2nao/p/7263977.html

https://blog.csdn.net/xiaofeixiaqing/article/details/51250401

https://www.cnblogs.com/zeroingToOne/p/8945066.html

https://www.cnblogs.com/jpfss/p/8516010.html

https://blog.csdn.net/qq_40266238/article/details/84313357

https://blog.csdn.net/weixin_34248487/article/details/87485507

https://blog.csdn.net/sx1119183530/article/details/79735348