演示

@Bean

将 @Service 上的方法注册为 DI 单例工厂,用于接入 BullMQ、Redis 等第三方实例。

作用

  • 在 @Service 类的私有(或公开)方法上添加装饰器
  • 该方法的返回值会作为单例注册进插件的 DI 容器
  • 其他 service / controller 可以通过类型(或返回的类)用 @Inject 获取该实例
  • 非常适合封装非自有的库(BullMQ、ioredis、AWS SDK 等)

规则

  • 宿主类必须是 @Service(),并出现在模块的 providers 中
  • 工厂在 DI 装配阶段执行 — 保持轻量(只创建 client / queue,重活延后)
  • 每个 @Bean 方法只返回一个具体实例
  • 任何地方都不支持构造函数注入 — 使用方通过属性 @Inject 注入

BullMQ Queue 示例

常见模式:为自定义后台任务暴露一个 Queue。周期性调度请优先使用 CronJobService。

TSXfactory
1import { Queue } from "bullmq"; 2import { Bean, Service } from "@quan-erp/shared-backend-core"; 3 4@Service() 5export class QueueRegistryService { 6 @Bean() 7 private registerQueue() { 8 return new Queue("my-queue", { connection: redisOptions }); 9 } 10}
TSXinject consumer
1import { Queue } from "bullmq"; 2import { Inject, Service } from "@quan-erp/shared-backend-core"; 3 4@Service() 5export class JobPublisherService { 6 @Inject(Queue) // or the concrete token your factory returns 7 private queue: Queue; 8 9 async enqueue(payload: unknown) { 10 await this.queue.add("task", payload); 11 } 12}

何时使用

  • 适用 — 需要共享单例的 Queue / Worker / Redis / HTTP SDK 客户端
  • 适用 — 构造时需要读取 env/config 的适配器
  • 不适用 — 普通插件服务(用 @Service + @Inject)
  • 不适用 — 定时任务(用 CronJobService,见 Cron job)

最佳实践

  • 工厂方法要小巧、命名清晰(registerX / createX)
  • 连接配置从 PluginEnv / base env 读取 — 严禁硬编码机密
  • 如库需要清理,在 @OnUninstall 中断开连接
  • 把宿主 @Service 加入 @Module({ providers }),工厂才会真正执行