欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • 引言
  • 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;黑色的部分…