天天看點

簡述遇到的一些問題如果出現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