框架為我們做了什么?

1. SpringBoot

1.1 web服務器

Spring Boot 的 web 服務器原理主要基于其嵌入式服務器的概念,這意味著它內嵌了一個 web 服務器,無需部署到外部服務器上。Spring Boot 內嵌了如 TomcatJettyUndertowservlet 容器

1.2 servlet

Servlet(Server Applet)是 Java EE(Java Enterprise Edition)規范的一部分,它是一個運行在服務器端的Java程序,用于生成動態網頁。Servlet 容器(如 Tomcat)負責管理 Servlet 的生命周期和執行。以下是 Servlet 編程的基本原理:

  1. Servlet 接口:Servlet 必須實現 javax.servlet.Servlet 接口,該接口定義了五個方法:init(), service(), getServletConfig(), getServletInfo(), 和 destroy()

  2. Servlet 生命周期: Servlet 的生命周期從實例化開始,通過 init() 方法初始化,然后可以接收服務請求,最后通過 destroy() 方法銷毀。

  3. 請求處理: Servlet 容器接收到客戶端的請求后,會調用 Servlet 的 service() 方法,該方法根據請求的類型(如 GET 或 POST)決定調用 doGet()doPost() 方法。

  4. 多線程:Servlet 容器支持多線程,Servlet 容器可以創建多個 Servlet 實例或使用同一個 Servlet 實例的多個線程來處理并發請求。

  5. Servlet 映射: Servlet 映射定義了 URL 到 Servlet 的映射關系。映射可以在 web.xml 文件中配置,也可以使用注解(如 @WebServlet)。

  6. 請求和響應對象: Servlet 使用 HttpServletRequestHttpServletResponse 對象來與客戶端進行交互。HttpServletRequest 包含了請求信息,而 HttpServletResponse 用于構造響應。

  7. 事件監聽器: Servlet API 提供了多種事件監聽器,如 ServletContextListenerHttpSessionListener 等,它們可以在 Servlet 生命周期的關鍵時刻執行特定的操作。

  8. 過濾器: Servlet 容器允許開發者實現 javax.servlet.Filter 接口來攔截請求和響應,進行預處理或后處理。

  9. 會話管理: Servlet API 通過 HttpSession 對象支持會話管理,允許在多個頁面請求之間保持狀態。

  10. 安全: Servlet 容器和 Servlet 可以配置安全性,如使用聲明式和編程式安全控制對資源的訪問。

  11. Servlet 3.0 異步處理:Servlet 3.0 引入了異步處理機制,允許 Servlet 方法異步執行,不阻塞容器線程,提高應用程序的并發處理能力。

  12. 依賴注入: Servlet 3.0 還支持依賴注入(DI),可以直接在 Servlet 中注入服務和管理 Bean。

Servlet 編程模型為構建基于 Java 的服務器端應用程序提供了一種簡單、一致和可擴展的方式。通過 Servlet,開發者可以生成動態內容、處理表單提交、與數據庫交互等。

1.3 不依賴框架可以怎么做?

不使用 Spring 框架,您仍然可以使用 Java 的標準庫 java.netjavax.servlet 來提供 HTTP 接口。以下是兩種常見的方法:

1.3.1 使用 java.net

Java 的 java.net 包提供了基本的網絡通信能力,可以用來創建簡單的 HTTP 服務器。以下是一個使用 ServerSocketSocket 來處理 HTTP 請求的簡單示例:

import java.io.*;
import java.net.*;public class SimpleHttpServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Server is listening on port 8080...");while (true) {Socket socket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String inputLine;while ((inputLine = in.readLine()) != null) {if (!inputLine.isEmpty()) {break;}}// 簡單的請求處理邏輯String response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, World!";out.write(response);out.flush();// 關閉連接in.close();out.close();socket.close();}}
}

這個示例創建了一個在 8080 端口上監聽的 HTTP 服務器,對于每個連接,它發送一個簡單的響應 “Hello, World!”。

1.3.2 使用 javax.servlet

如果您想使用更接近現代 Web 應用的方法,可以使用 javax.servlet 包來創建一個基于 Servlet 的 HTTP 服務器。以下是一個使用 HttpServletHttpServer 的示例:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/plain");PrintWriter out = response.getWriter();out.println("Hello, World!");}public static void main(String[] args) throws Exception {HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);Context context = server.createContext("/myapp", (servletRequest, servletResponse) -> {new MyServlet().doGet(servletRequest, servletResponse);});server.start();System.out.println("Server is started at port 8080...");}
}

這個示例創建了一個 Servlet,它在接收到 GET 請求時返回 “Hello, World!”。然后使用 HttpServer 來啟動服務器,并定義了 URL 路徑 /myapp 來映射到我們的 Servlet。

請注意,這些示例都是非常簡單的基礎示例,用于演示如何不使用 Spring 框架來提供 HTTP 接口。在實際開發中,您可能需要考慮更多的因素,比如請求解析、路由、錯誤處理、安全性、并發處理等。對于更復雜的應用,您可能需要使用更高級的 Web 服務器或框架。

2. Gin

2.1 web服務器

Gin 是一個用 Go 語言編寫的 Web 框架,以其高性能和快速的開發效率而聞名。Gin 框架本身并不內嵌 Web 服務器,而是使用 Go 標準庫中的 net/http 包來處理 HTTP 請求和響應。net/http 包提供了一個非常輕量級的 HTTP 服務器,它足以應對大多數 Web 應用的需求。

以下是 Gin 框架啟動服務器的基本步驟:

  1. 創建路由: 使用 Gin 創建路由,定義應用程序的端點和對應的處理函數。

  2. 設置中間件: 可以設置中間件來處理跨域請求、日志記錄、請求驗證等。

  3. 啟動服務器: 使用 gin.Default()gin.New() 創建一個 Gin 實例,然后調用 Run 方法來啟動服務器。Run 方法接受一個字符串參數,表示服務器監聽的地址和端口。

  4. 監聽端口: Gin 使用 http.ListenAndServe 函數來監聽指定的端口,等待客戶端的連接。

  5. 處理請求: 當客戶端發起請求時,Gin 會根據定義的路由規則將請求分發到對應的處理函數。

  6. 響應客戶端: 處理函數執行完成后,Gin 會構造 HTTP 響應并發送給客戶端。

下面是一個簡單的 Gin 應用啟動服務器的例子:

package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default() // 創建一個默認的 Gin 路由器// 定義路由router.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{
{            "message": "hello world"}})})// 啟動服務器,默認在 8080 端口監聽router.Run(":8080")
}

在這個例子中,Gin 應用定義了一個處理根 URL (/) 的路由,當訪問這個路由時,它會返回一個 JSON 響應。然后,使用 router.Run(":8080") 啟動服務器,監聽 8080 端口。

2.2 不依賴框架如何提供HTTP接口?

在 Go 語言中,即使不使用 Gin 框架,也可以通過標準庫 net/http 來提供 HTTP 接口。以下是如何使用 Go 的 net/http 包來創建一個簡單的 HTTP 服務器并提供接口的示例:

package mainimport ("fmt""log""net/http"
)// 定義一個處理函數,它響應客戶端請求
func myHandler(w http.ResponseWriter, r *http.Request) {// 設置響應的頭部,指明返回的內容類型w.Header().Set("Content-Type", "text/plain")// 響應客戶端請求fmt.Fprintf(w, "Hello, World! This is a simple HTTP interface.")
}func main() {// 設置路由,將"/"路徑的請求映射到myHandler處理函數http.HandleFunc("/", myHandler)// 定義服務器監聽的端口port := "8080"// 啟動服務器,阻塞等待請求log.Printf("Server starting on port %s", port)if err := http.ListenAndServe(":"+port, nil); err != nil {log.Fatal("ListenAndServe error: ", err)}
}

在這個示例中,我們首先定義了一個 myHandler 函數,它接收 http.ResponseWriter*http.Request 作為參數。http.ResponseWriter 用于構造 HTTP 響應,*http.Request 包含了請求的信息。

然后,我們使用 http.HandleFunc 來設置路由,將根路徑(“/”)的請求映射到 myHandler 函數。

最后,我們使用 http.ListenAndServe 來啟動服務器,它接受一個端口號和一個處理器(這里是 nil,因為我們已經使用 HandleFunc 設置了處理器)。服務器將阻塞等待請求,并在接收到請求時調用相應的處理函數。

這個簡單的服務器將響應所有到根路徑的 GET 請求,并返回 “Hello, World! This is a simple HTTP interface.” 文本。

Go 的 net/http 包非常強大,它支持路由、中間件、文件服務、靜態文件處理等,可以滿足大多數 Web 服務的需求。對于更高級的用例,比如參數解析、JSON 響應、請求驗證等,你可能需要編寫更多的邏輯或使用第三方庫。

3. MyBatis

3.1 MyBatis 原理

MyBatis 是一個半自動的持久層框架,用于在 Java 應用程序中簡化數據庫操作。它提供了簡單的 API 和映射配置,以實現類型安全、對象關系映射(ORM)和 SQL 映射。以下是 MyBatis 的一些核心原理:
(1)SqlSessionFactorySqlSessionFactory 是 MyBatis 的核心對象,負責創建 SqlSession。它通過 XMLConfigBuilderXMLMapperBuilder 加載配置文件和映射文件來構建。

(2)SqlSessionSqlSession 是 MyBatis 工作的主要執行者,提供了執行命令對象(如 update, select, delete, insert)的方法,以及提交和回滾事務的功能。

(3)映射文件:MyBatis 使用 XML 或注解來映射 SQL 語句和 Java 類。這些映射文件定義了 SQL 語句和 Java 對象之間的映射關系。

(4)動態 SQL:MyBatis 支持動態 SQL,允許使用 if、choose、when、otherwise、trim、set 等元素來構建條件 SQL。

(5)參數映射:MyBatis 支持自動將 Java 對象的屬性映射到 SQL 語句的參數上。

(6)結果映射:MyBatis 支持將查詢結果映射到 Java 對象。可以通過 <resultMap> 元素定義復雜的結果映射。

(7)一級緩存和二級緩存

  • SqlSession 提供了一級緩存,它是會話級別的緩存,用于存儲查詢結果。
  • MyBatis 還支持二級緩存,它是全局的,可以被多個 SqlSession 共享。

(8)插件機制:MyBatis 允許開發者編寫插件來攔截方法的執行,實現自定義邏輯,如分頁、審計等。

(9)配置和映射的分離:MyBatis 支持將配置和映射分離,使得 SQL 映射可以獨立于配置文件存在。

(10)事務管理:MyBatis 支持聲明式事務和編程式事務管理。

(11)MyBatis Generator:MyBatis 提供了代碼生成器,可以根據數據庫表結構自動生成映射文件和 Java 模型類。

(12)MyBatis 3 增強的映射特性:MyBatis 3 引入了新的映射特性,如 @SelectProvider, @UpdateProvider, @InsertProvider, 和 @DeleteProvider 注解,允許使用 Java 代碼提供 SQL 語句。

MyBatis 的設計哲學是提供足夠的靈活性,讓開發者可以編寫高效的 SQL 語句,同時保持代碼的簡潔性和可維護性。通過 MyBatis,開發者可以避免大量的樣板代碼,并能夠更精細地控制數據庫操作。

3.2 不使用框架該怎么做?

使用 Java 的 JDBC API 直接操作數據庫。JDBC 是 Java 語言中用來規范客戶端程序如何訪問數據庫的應用程序接口,通過 JDBC 可以連接任何符合 SQL 數據庫。

4. Gorm

4.1 Gorm原理

Gorm 是 Go 語言的一個對象關系映射(ORM)庫,用于操作各種 SQL 數據庫系統。它提供了一個簡單易用的 API 來與數據庫進行交互,同時隱藏了底層 SQL 語句的復雜性。以下是 Gorm 的一些核心原理:
(1)連接管理:Gorm 管理數據庫連接,允許配置多個數據源,并在它們之間進行切換。
(2)自動遷移:Gorm 支持自動遷移功能,可以自動創建或修改數據庫表結構以匹配 Go 結構體的定義。
(3)事務處理:提供了事務的支持,可以確保數據的一致性和完整性。
(4)關聯處理:支持定義模型之間的關聯關系,如一對一、一對多和多對多。
(5)預加載:支持預加載(Eager Loading)關聯數據,以減少數據庫查詢次數。
(6)懶加載:支持懶加載(Lazy Loading)關聯數據,按需從數據庫加載數據。
(7)條件查詢:支持鏈式調用,可以方便地構建復雜的查詢條件。
(8)批量操作:支持批量創建、更新和刪除記錄。
(9)事務回滾:在發生錯誤時,可以回滾事務,保證數據操作的原子性。
(10)自定義操作:允許自定義 SQL 語句或使用原生數據庫驅動的函數。
(11)日志記錄:提供了詳細的 SQL 日志記錄功能,方便調試。
(12)結果映射:將查詢結果映射到 Go 結構體中,簡化了結果處理。
(13)插件系統:Gorm 擁有豐富的插件系統,可以擴展其功能,如添加新的數據庫類型支持。
(14)接口和抽象:Gorm 提供了一系列接口和抽象,使得替換底層數據庫驅動或自定義行為變得簡單。
(15)兼容性:支持多種 SQL 數據庫,如 MySQL, PostgreSQL, SQLite, SQL Server 等。

Gorm 的工作原理基于以下幾個步驟:

  • 定義模型:使用 Go 的結構體定義數據模型,Gorm 會根據這些結構體來生成和操作數據庫表。
  • 連接數據庫:使用 Gorm 的 gorm.Open() 方法連接到數據庫。
  • 創建/更新記錄:使用 Create(), Save(), Update() 等方法操作數據庫記錄。
  • 查詢記錄:使用 Find(), First(), Scan() 等方法查詢數據庫。
  • 刪除記錄:使用 Delete() 方法從數據庫中刪除記錄。
  • 關閉數據庫連接:操作完成后,使用 Close() 方法關閉數據庫連接。

Gorm 通過簡化數據庫操作,讓開發者能夠更專注于業務邏輯,而不是底層的 SQL 語句。同時,它保留了足夠的靈活性,允許在需要時執行自定義的 SQL 操作。

4.2 不使用框架該怎么做?

如果不使用 Gorm 框架,你仍然可以使用 Go 語言的 database/sql 標準庫來直接與數據庫進行交互。以下是不使用 Gorm 框架實現數據庫操作的一些基本步驟:
(1)導入包:導入 database/sql 包以及其他可能需要的包,如 fmt 用于格式化輸出,log 用于記錄日志。
(2)配置數據源:使用正確的驅動和連接字符串配置數據源。
(3)創建數據庫連接:使用 sql.Open() 函數創建到數據庫的連接。
(4)準備 SQL 語句:使用 db.Prepare() 準備 SQL 語句,這有助于提高性能并防止 SQL 注入。
(5)執行 SQL 語句:使用 Exec(), Query()QueryRow() 執行 SQL 語句。
(6)處理結果:使用 RowsRow 對象來迭代查詢結果。
(7)錯誤處理:檢查并處理可能發生的錯誤。
(8)關閉資源:使用 Close() 方法關閉 Rows, StmtDB 對象以釋放資源。
(9)事務處理:使用 Tx 對象管理事務。

下面是一個簡單的示例,演示了如何使用 database/sql 包執行一個查詢并將結果打印出來:

package main
import ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql" // 導入 MySQL 驅動
)func main() {// 配置數據源dsn := "username:password@/dbname?charset=utf8&parseTime=True&loc=Local"db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()// 測試連接err = db.Ping()if err != nil {log.Fatal(err)}// 準備 SQL 語句rows, err := db.Query("SELECT id, name FROM users")if err != nil {log.Fatal(err)}defer rows.Close()// 處理結果var id intvar name stringfor rows.Next() {err = rows.Scan(&id, &name)if err != nil {log.Fatal(err)}fmt.Printf("ID: %d, Name: %s\n", id, name)}// 檢查可能的錯誤err = rows.Err()if err != nil {log.Fatal(err)}
}

在這個示例中,我們首先導入了 MySQL 的驅動(需要使用 go get 命令安裝),然后配置了數據源字符串(DSN),接著創建了數據庫連接并測試了連接的有效性。之后,我們準備并執行了一個 SQL 查詢,迭代結果集并打印出每行的數據。最后,我們檢查并處理了可能發生的錯誤。

請注意,實際開發中還需要考慮 SQL 注入防護、更復雜的錯誤處理、日志記錄、配置和查詢參數化等因素。此外,你可能需要編寫額外的代碼來處理數據庫遷移、模型定義、關聯關系等高級功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40425.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40425.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【鴻蒙學習筆記】創建自定義組件

官方文檔&#xff1a;創建自定義組件 目錄標題 自定義組件的基本結構&#xff11;?struct 自定義組件名 {...}&#xff20;ComponentEntry &#xff11;? &#xff12;? &#xff13;? &#xff14;? &#xff15;? &#xff16;? &#xff17;? &#xff18;? &…

Python | Leetcode Python題解之第206題反轉鏈表

題目&#xff1a; 題解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseList(self, head: Optional[ListNode]) -> Optio…

VulnHub靶場之DarkHole_1

1 信息收集 1.1 主機發現 arp-scan -l 主機IP地址為&#xff1a;192.168.1.17 1.2 端口和服務掃描 nmap -sS -sV -A -T5 -p- 192.168.1.17 開放22&#xff0c;80端口 1.3 目錄掃描 dirsearch -u 192.168.1.17 2 滲透 2.1 訪問端口 2.2 注冊賬號 暴力破解不現實&#…

Python爬取國家醫保平臺公開數據

國家醫保服務平臺數據爬取python爬蟲數據爬取醫療公開數據 定點醫療機構查詢定點零售藥店查詢醫保機構查詢藥品分類與代碼查詢 等等&#xff0c;數據都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 簽名參數&#xff1a;signData {dat…

【AI原理解析】-目標檢測概述

目錄 一、目標檢測算法的分類 1. 基于傳統方法的目標檢測算法 2. 基于深度學習的目標檢測算法 二、主要目標檢測算法 1. R-CNN系列 2. YOLO系列 3. SSD 4. RetinaNet 三、目標檢測算法的特點 四、評估指標 五、應用領域 一、目標檢測算法的分類 目標檢測算法主要分…

java版本ERP管理系統源碼 Spring Cloud ERP_ERP系統_erp軟件_ERP管理系統

在當今數字化時代&#xff0c;企業對高效、穩定且易于擴展的管理系統的需求日益增長。為了滿足這一需求&#xff0c;我們精心打造了一款基于Java技術的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系統。該系統充分利用了Spring Cloud Alibaba、Spring Boot、…

python-計算矩陣邊緣元素之和(賽氪OJ)

[題目描述] 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。 所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。輸入&#xff1a; 輸入共 m 1 行。 第一行包含兩個整數 m, n (1 < m,n < 100) &#xff0c;分別為矩陣的…

VDS虛擬導播切換臺軟件

VDS 導播軟件是一款功能強大的虛擬導播系統軟件&#xff0c;具有全媒體接入、播出內容豐富、調音臺、快捷切播與導播鍵盤、云臺控制等特點&#xff0c;同時支持向多個平臺直播推流。以下是一些常見的 VDS 導播軟件特點&#xff1a; 1. 全媒體接入&#xff1a;支持多種設備和網…

Ubuntu和Windows系統之Mamba_ssm安裝

Mamba的論文&#xff1a;https://arxiv.org/abs/2312.00752 Mamba的github&#xff1a;https://github.com/state-spaces/mamba 一、Ubuntu安裝 直接新建一個環境是最好的&#xff0c;不然很容易產生各種沖突 # 創建環境和相關包 conda create -n mamba python3.10.13 cond…

設計模式——程序員的武功招式

設計模式就是套路&#xff0c;就是武功招式。 碰到什么問題出什么招。 設計模式是軟件行業幾十年的應對問題的經驗總結——武功招式總結。 大成境界是無招勝有招。 但是問題是無限的&#xff0c;對應的招式&#xff0c;你也可以創建&#xff0c;所以現在設計模式還在不斷的誕生…

嵌入式Framebuffer面試題精要及參考答案

什么是Framebuffer?簡述其在Linux系統中的作用。 Framebuffer,中文譯作幀緩沖,是Linux內核提供的一種抽象設備接口,用于允許用戶態的應用程序直接訪問和操作顯示設備的顯存,從而實現圖形的直接輸出。在Linux系統中,Framebuffer扮演著連接硬件顯卡和軟件應用的關鍵角色。…

Linux 文件系統檢查與修復:使用fsck、e2fsck等命令

Linux文件系統檢查與修復&#xff1a;使用fsck、e2fsck等命令 引言 文件系統是操作系統中用于管理和存儲文件的關鍵組件。然而&#xff0c;文件系統在使用過程中可能會出現各種問題&#xff0c;如數據損壞、文件丟失等。為了確保文件系統的完整性和穩定性&#xff0c;我們需要…

java-arraylist 源碼分析 1

## 深入分析 Java 中的 ArrayList 源碼 ArrayList 是 Java 集合框架中的一個重要類&#xff0c;它基于數組實現&#xff0c;提供了動態數組的功能。ArrayList 是一個非常常用的集合類&#xff0c;因為它在隨機訪問和遍歷方面性能優越。本文將詳細分析 ArrayList 的源碼&#x…

spring cloud gateway客戶端websocket斷開連接,服務側連接沒有關閉的問題處理

之前在單體架構項目中使用了websocket主動推送消息的功能&#xff0c;后來改成了微服務架構&#xff0c;結果發現部分消息丟失&#xff0c;沒能推送給客戶端&#xff1b;深入排查發現服務端無法感知websocket連接狀態&#xff0c;但是在單體架構里面是沒這個問題的&#xff0c;…

Redis【超詳細】

Redis 是一個基于內存的key-value結構的數據庫 一、redis的安裝 1.1、安裝步驟 1&#xff09;安裝Redis依賴 Redis是基于c語言編寫的&#xff0c;因此需要安裝對應的gcc環境 yum install -y gcc tcl 2&#xff09;進入/usr/local/src/目錄上傳并解壓安裝包 解壓&#xf…

【APK】SDKManager運行后閃退

本地JDK已安裝&#xff0c;且配置了環境變量&#xff0c;未安裝 android studiio 問題描述&#xff1a;右鍵以管理員身份運行 SDKManager&#xff0c;終端窗口閃退 問題原因&#xff1a;未找到正確的Java路徑 解決辦法&#xff1a; 1.修改tools目錄下的 android.bat 文件&am…

langchain 入門中篇:數據封裝,Memory 封裝

數據的處理流程可以看一張圖來幫助理解 數據來源可以是網絡&#xff0c;可以是郵件&#xff0c;可以是本地文件 經過 Document Loaders 加載&#xff0c;再在 Transform 階段對文檔進行 split, filter, translate, extract metadata 等操作&#xff0c;之后在 Embed 階段進行向…

Keil用ST-LINK下載STM32程序后不自動運行

之后程序可以運行了&#xff0c;但是串口還沒有輸出&#xff0c;在debug模式下都是ok的。

加權 KNN 算法的原理與詳解

加權kNN&#xff0c;k近鄰算法的增強改進版本。 加權KNN算法 近鄰算法&#xff08;k-Nearest Neighbors, kNN&#xff09;是一種用于分類和回歸的非參數方法。它的基本思想是“看鄰居”&#xff0c;即通過查找離目標點最近的 K 個數據點&#xff0c;來判斷目標點的類別或數值。…

docker安裝elasticesarch-head

安裝 Elasticsearch-Head 通常涉及以下步驟&#xff1a; 拉取 Elasticsearch-Head 的 Docker 鏡像。 運行 Elasticsearch-Head 容器并連接到 Elasticsearch 實例。 以下是具體的命令&#xff1a; 拉取 Elasticsearch-Head 的 Docker 鏡像 docker pull mobz/elasticsearch-…