FastAPI快速入門P2:與SpringBoot比較

歡迎來到啾啾的博客🐱。
記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。
有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。

目錄

  • 引言
  • 1 FastAPI事件管理
  • 2 類的使用
    • 2.1 初始化方法對比
    • 2.2 Pydantic的構造
  • 3 依賴管理
  • 4 類方法和靜態方法
    • 4.1 @classmethod

引言

在之前的《FastAPI快速入門》中,我們對服務器搭建、依賴注入、接口定義與Pydantic模型有了基本了解。本篇繼續深入FastAPI的核心機制,并與Java生態的SpringBoot進行對比,幫助Java開發者快速建立技術映射。

1 FastAPI事件管理

FastAPI 提供了 startup 和 shutdown 事件來處理應用啟動和關閉時的邏輯,類似于 Spring Boot 的ApplicationRunner@PreDestroy
不過, on_event 在較新版本中已被棄用,推薦使用 lifespan 處理應用生命周期事件。

from contextlib import asynccontextmanager
from fastapi import FastAPI# 現代 lifespan 處理方式
@asynccontextmanager
async def lifespan(app: FastAPI):# 啟動邏輯 - 類似 @PostConstructprint("🚀 應用啟動:數據庫連接池初始化")cache = {"hot_items": load_hot_data()}yield cache  # 將資源傳遞給路由,即賦值給app.state# 關閉邏輯 - 類似 @PreDestroyprint("🛑 應用關閉:釋放數據庫連接池")cache.clear()app = FastAPI(lifespan=lifespan)  # 注入 lifespan@app.get("/items")
async def get_items():return app.state["hot_items"]  # 直接使用初始化資源

連接池示例

@asynccontextmanager
async def lifespan(app: FastAPI):# 初始化 PostgreSQL 連接池app.state.db_pool = await asyncpg.create_pool(dsn=os.getenv("DB_DSN"),min_size=5,max_size=20)# 初始化 Redis 客戶端app.state.redis = await aioredis.from_url("redis://localhost", encoding="utf-8",decode_responses=True)yield# 資源清理await app.state.db_pool.close()await app.state.redis.close()

對比SpringBoot

// Spring Boot 等效實現
@SpringBootApplication
public class DemoApp implements ApplicationRunner {@Autowiredprivate DataSource dataSource;@PreDestroypublic void onExit() {System.out.println("🛑 釋放資源");}@Overridepublic void run(ApplicationArguments args) {System.out.println("🚀 初始化完成");}
}

FastAPI采用顯式事件注冊,SpringBoot通過接口/注解實現,后者更符合Java的約定優于配置原則。

特性FastAPI (lifespan)Spring Boot
事件類型異步上下文管理器接口實現 + 注解
資源傳遞yield 返回 → 直接注入路由通過 ApplicationContext
錯誤處理自帶 try/finally 語義需手動實現銷毀邏輯
依賴注入通過 app.state 訪問@Autowired 自動裝配
多階段初始化單入口統一管理多種初始化接口可選

![[FastAPI聲明周期.png]]

2 類的使用

2.1 初始化方法對比

Python中有__new____init__方法可以用于在對象實例創建時執行一些操作。

class Service:def __new__(cls):print("1. 分配內存 → 類似Java的new關鍵字")return super().__new__(cls)def __init__(self):print("2. 初始化屬性 → 類似Java的構造函數")self.cache = {}

__new__方法比__init__先調用。
Java等效實現如下:

public class Service {private Map<String, Object> cache;public Service() {System.out.println("構造函數初始化");this.cache = new HashMap<>();}
}
  • cls 與 self
    cls代表類本身。在調用類方法時,Python會自動將類對象作為第一個參數傳遞給方法。通過 cls 能夠訪問和修改類的屬性,還能創建類的實例。
    self 代表類的實例對象。在調用實例方法時,Python 會自動將實例對象作為第一個參數傳遞給方法。借助 self 可以訪問和修改實例的屬性和方法。

2.2 Pydantic的構造

Pydantic模型是默認支持全參構造,等效于@NoArgsConstructor+@AllArgsConstructor的。
且可以通過關鍵字或字典解包,所以不會有Java的構造函數參數膨脹問題。

from pydantic import BaseModelclass User(BaseModel):name: strage: int# 構造方式1:關鍵字參數
user = User(name="Alice", age=30) # 自動觸發類型驗證錯誤# 構造方式2:字典解包
data = {"name": "Alice", "age": 30}
user = User(**data)

SpringBoot等效

// Lombok簡化構造
@Data 
@AllArgsConstructor 
public class UserDTO {private Long id;private String name;private String email;
}

3 依賴管理

使用Spring框架時,對象交由框架處理,默認單例,且可以做到復雜的依賴管理。
FastAPI的依賴系統輕量但強大,也支持函數/類級別注入:

from fastapi import Dependsdef get_db_session():print("創建DB會話 → 類似Spring的@Bean")yield session  # 通過yield實現資源清理print("關閉DB會話")@app.get("/users")
def get_users(db = Depends(get_db_session)):return db.query(User).all()

類似于SpringBoot

@RestController
public class UserController {private final UserRepository repo;  // 構造器注入public UserController(UserRepository repo) {this.repo = repo;}@GetMapping("/users")public List<User> getUsers() {return repo.findAll();}
}@Repository  // 自動裝配
public interface UserRepository extends JpaRepository<User, Long> {}

核心差異

特性FastAPISpring Boot
作用域函數級控制完整的Bean作用域
生命周期顯式yield管理容器自動管理
配置復雜度低(Python動態特性)高(需學習Spring生態)
AOP支持有限(通過中間件)完善(@Aspect等)

4 類方法和靜態方法

4.1 @classmethod

使用裝飾器 @classmethod裝飾的類和Java中的靜態方法一樣,可以直接通過類名調用。
不同的是@classmethod裝飾的方法有默認入參cls。

class Validator:@classmethoddef validate_email(cls, email: str) -> bool:return "@" in email  # cls可訪問類屬性# 直接類調用 → 類似Java靜態方法
Validator.validate_email("test@ex.com")

Java等效如下:

public class Validator {public static boolean validateEmail(String email) {return email.contains("@");}
}

關鍵區別:Python的類方法自動獲取cls參數,可訪問類狀態,而Java靜態方法無this/cls概念。

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

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

相關文章

SAP-ABAP: Open SQL集合函數COUNT(統計行數)、SUM(數值求和)、AVG(平均值)、MAX/MIN(極值)深度指南

SAP Open SQL集合函數深度指南 1. 核心價值與特性函數作用關鍵特性COUNT統計行數用COUNT(*)包含NULL值行&#xff0c;COUNT(字段)排除NULLSUM數值求和自動過濾NULL值&#xff0c;結果類型與源字段相同AVG平均值必須用TYPE f接收&#xff0c;否則四舍五入導致精度丟失MAX/MIN極值…

【docker】UnionFS聯合操作系統

Linux 的 Namespace、CGroups 和 UnionFS 三大技術支撐了 Docker 的實現。 一、為什么需要聯合文件系統&#xff1f;在傳統操作系統中&#xff0c;每個文件系統都是獨立的孤島。但當我們需要&#xff1a;合并多個目錄的內容保持基礎系統不變的同時進行修改高效共享重復文件內容…

CTF-XXE 漏洞解題思路總結

一、XXE 漏洞簡介XXE (XML External Entity) 漏洞允許攻擊者通過構造惡意的 XML 輸入&#xff0c;強迫服務器的 XML 解析器執行非預期的操作。在 CTF 場景中&#xff0c;最常見的利用方式是讓解析器讀取服務器上的敏感文件&#xff0c;并將其內容返回給攻擊者。二、核心攻擊載荷…

GitLab:一站式 DevOps 平臺的全方位解析

GitLab&#xff1a;一站式 DevOps 平臺的全方位解析 在當今數字化時代&#xff0c;軟件研發的效率與質量直接決定企業的市場競爭力。GitLab 作為全球領先的 DevOps 平臺&#xff0c;憑借 “從構思到部署” 的全流程管理能力&#xff0c;已成為無數企業加速軟件交付的核心工具。…

Flink富函數:一種更靈活、可擴展的方式來定義數據流的處理邏輯

本文重點 Flink中的富函數類是一組用于處理數據流的函數接口和實現類。富函數類提供了一種更靈活和可擴展的方式來定義數據流的處理邏輯。 富函數類 富函數類是DataStream API提供的一個函數類的接口,所有的Flink函數類都有其Rich版本。富函數類一般是以抽象類的形式出現的。…

【STM32】HAL庫中的實現(四):RTC (實時時鐘)

&#x1f552;HAL庫中的實現&#xff1a;RTC&#xff08;Real-Time Clock&#xff09;實時時鐘RTC 是 STM32 的低功耗實時時鐘模塊&#xff0c;常用于&#xff1a; 實時時間維護&#xff08;年月日時分秒&#xff09;定時喚醒日志時間戳鬧鐘功能RTC&#xff08;實時時鐘&#x…

Pauli 矩陣指數函數展開為顯式矩陣 e^A -> B

要展開表達式 為普通矩陣&#xff0c;其中 是 Pauli 矩陣&#xff0c; 是單位向量&#xff0c; 是實數。以下是詳細推導步驟&#xff1a;1. Pauli 矩陣的性質Pauli 矩陣定義為&#xff1a;它們滿足以下關系&#xff1a;?其中 是 Kronecker delta&#xff0c;? 是 Levi-…

【Algorithm | 0x03 搜索與圖論】DFS

DFS基礎知識典型例題例1&#xff1a;n皇后問題例2&#xff1a;拍照例3&#xff1a;理發基礎知識 核心原理&#xff1a;一條路走到黑 示意圖&#xff1a;其含義表示&#xff0c;在這個圖中頂層是第0層&#xff0c;也就是后面dfs的入口&#xff0c;一般從dfs(0)開始操作。 模版&a…

Redis的數據過期策略有哪些?

Redis內部通過兩種主要策略來處理過期的Key&#xff1a; 惰性刪除 惰性刪除&#xff1a;顧明思議并不是在TTL到期后就立刻刪除&#xff0c;而是在訪問一個key的時候&#xff0c;Redis會先檢查這個鍵是否過期。如果過期&#xff0c;就刪除它&#xff0c;然后返回nil。 這種方式非…

水庫雨水情測報和大壩安全監測系統解決方案

一、方案背景 在全球氣候變化和極端天氣頻發的背景下&#xff0c;水庫作為重要的水利設施&#xff0c;承擔著防洪、供水、灌溉、發電等多重功能。然而&#xff0c;由于水庫蓄水量巨大&#xff0c;一旦發生潰壩或運行異常&#xff0c;將對下游地區造成不可估量的生命財產損失。因…

BFS 和 DFS 編程思想、框架、技巧及經典例題總結

BFS 和 DFS 編程思想、框架、技巧及經典例題總結 一、核心編程思想 BFS&#xff08;廣度優先搜索&#xff09; 核心思想&#xff1a;以「層次遍歷」為核心&#xff0c;從起點出發&#xff0c;優先探索距離起點最近的節點&#xff0c;逐層擴散遍歷。本質&#xff1a;通過「隊列」…

【面試場景題】日志去重與統計系統設計

文章目錄題目場景描述要求問題考察點解答思考一、核心解決方案&#xff08;基礎版&#xff0c;單節點32GB內存、10臺節點&#xff09;1. 整體架構選型2. 關鍵步驟詳解&#xff08;1&#xff09;數據分片&#xff1a;解決“數據量大&#xff0c;單節點處理不了”的問題&#xff…

【Day 16】Linux-性能查看

目錄 一、Stress系統壓力測試工具 二、性能查看 &#xff08;一&#xff09;查看CPU # nproc # lscpu # top # uptime # mpstat 數字1 數字2 &#xff08;二&#xff09;查看內存 # dmidecode -t memory | less # free -h # …

【ICCV2017】Deformable Convolutional Networks

一、摘要盡管卷積神經網絡&#xff08;CNN&#xff09;在視覺識別任務上取得巨大成功&#xff0c;但其固有的固定幾何結構&#xff08;固定卷積采樣網格、固定池化窗口、固定 RoI 劃分&#xff09;嚴重限制了對未知幾何變換&#xff08;尺度、姿態、形變、視角變化&#xff09;…

echarts在前后端分離項目中的實踐與應用

目錄 一、ECharts簡介 二、后端數據接口設計 三、數據結構設計 1. 柱狀圖數據結構 2. 餅圖數據結構 四、后端實現要點 五、前端ECharts配置解析 1. 柱狀圖配置 2. 餅圖配置 六、最佳實踐建議 七、總結 一、ECharts簡介 ECharts是百度開源的一個基于JavaScript的可視…

SQL 四大語言分類詳解:DDL、DML、DCL、DQL

SQL&#xff08;結構化查詢語言&#xff09;通常被分為四種主要類型&#xff0c;每種類型負責不同的數據庫操作。下面我將詳細介紹這四類SQL語言的語法和用途。一、DDL (Data Definition Language) 數據定義語言功能&#xff1a;定義和管理數據庫對象結構&#xff08;表、視圖、…

ESP-idf框架下的HTTP服務器\HTML 485溫濕度采集并長傳

項目描述:本項目采用485采集溫濕度以及電壓電流等,485模塊分別為下圖,串口轉485模塊采用自動收發模塊,ESP32工作在AP熱點模式,通過手機連接esp32的熱點來和esp進行數據通訊,使用esp32作為HTTP服務器缺陷:項目的最終HTML頁面代碼可發給AI讓其寫注釋#include "freertos/Free…

雅江工程解鎖墨脫秘境:基礎條件全展示(區位、地震、景點、天氣)

目錄 前言 一、區位信息 1、空間位置 2、區位介紹 二、地震信息 1、歷史地震信息 2、5.0級以上大地震 三、景點信息 1、景點列表分布 2、4A級以上景點 四、天氣信息 1、天氣實況 2、天氣應對挑戰 五、總結 前言 相信最近大家對雅江電站的超級大工程項目應該有所耳…

??機器學習貝葉斯算法

??一、引言??在當今機器學習領域&#xff0c;貝葉斯算法猶如一顆璀璨的明星。你是否想過&#xff0c;垃圾郵件過濾系統是如何準確判斷一封郵件是否為垃圾郵件的呢&#xff1f;這背后可能就有貝葉斯算法的功勞。今天&#xff0c;我們就一同走進貝葉斯算法的世界&#xff0c;…

Chisel芯片開發入門系列 -- 18. CPU芯片開發和解釋8(流水線架構的代碼級理解)

以【5 Stage pipeline CPU】搜索圖片&#xff0c;選取5幅有代表性的圖列舉如下&#xff0c;并結合Chisel代碼進行理解和點評。 圖1&#xff1a;原文鏈接如下 https://acsweb.ucsd.edu/~dol031/posts/update/2023/04/10/5stage-cpu-pipeline.html 點評&#xff1a;黑色的部分…