NestJS如何在启动时创建类的唯一静态单实例且禁止重建
实现方案:NestJS 全局持久化单例实例
NestJS 中所有默认注册的 Provider 天生就是应用级单例,只要服务不重启,实例只会初始化一次,不会被重建,属性会全程保留,刚好匹配你的需求。
具体实现步骤
- 第一步:定义你的业务类,声明需要的静态/实例属性、业务逻辑
// persistent.service.ts export class PersistentService { // 自定义静态属性 static globalStaticConfig = { baseUrl: 'https://example.com', version: '1.0.0' }; // 实例持久化属性,服务运行期间修改后的值会全程保留 instanceRuntimeData: Record<string, any> = {}; // 构造函数只会在实例第一次创建时执行一次,可放初始化逻辑 constructor() { console.log('持久化实例初始化,服务运行全程仅执行一次'); } // 自定义业务方法 setRuntimeData(key: string, value: any) { this.instanceRuntimeData[key] = value; } getRuntimeData(key: string) { return this.instanceRuntimeData[key]; } }
- 第二步:在根模块(通常是AppModule)中注册该服务为全局Provider
// app.module.ts import { Module } from '@nestjs/common'; import { PersistentService } from './persistent.service'; @Module({ providers: [PersistentService], exports: [PersistentService], // 导出后所有其他模块都可以注入使用该实例 }) export class AppModule {}
- 第三步:在任意业务位置通过依赖注入调用,所有位置拿到的都是同一个实例
// 任意controller/service中使用示例 import { Injectable } from '@nestjs/common'; import { PersistentService } from './persistent.service'; @Injectable() export class UserService { // 注入的是全局唯一的持久化实例 constructor(private readonly persistentService: PersistentService) {} demoOperate() { // 修改实例属性,所有引用该实例的位置都会拿到更新后的值 this.persistentService.setRuntimeData('activeUserCount', 120); // 调用静态属性,全局共享 console.log(PersistentService.globalStaticConfig.version); } }
额外注意事项
- 如果你需要确保实例在应用启动时就立即初始化,不需要等被其他模块注入才创建,可以调整Provider注册配置,增加
eager: true参数:
// app.module.ts 调整providers配置 @Module({ providers: [ { provide: PersistentService, useClass: PersistentService, eager: true, // 应用启动阶段就完成实例初始化 } ], exports: [PersistentService] })
- 禁止手动通过
new PersistentService()创建实例,必须通过Nest依赖注入获取,才能保证拿到的是全局唯一的单例。 - 以上是服务运行时的内存级属性持久化,如果需要跨服务重启还保留属性值,需要额外对接数据库、Redis等持久化存储介质做数据落地。
内容的提问来源于stack exchange,提问作者valerius21
相关产品推荐
相关产品推荐

