Skip to content

全局模块和生命周期

全局模块

模块导出 provider,另一个模块需要 imports 它才能用这些 provider。

如何设置全局的provider呢?可以使用@Golbal() 来声明一个全局模块

js
@Golbal()
@Module({
  providers: [
    AaaService,
    BbbService
  ],
  exports: [
    AaaService,
    BbbService
  ]
})
export class AppModule {}
@Golbal()
@Module({
  providers: [
    AaaService,
    BbbService
  ],
  exports: [
    AaaService,
    BbbService
  ]
})
export class AppModule {}

然后其他模块就不需要imports来导入模块了。可以直接使用它里面的 Service

生命周期

1. 应用初始化阶段

  1. 递归初始化模块,会依次调用模块内的 controller、provider 的 onModuleInit 方法,然后再调用 module 的 onModuleInit 方法。

  2. 全部初始化完之后,再依次调用模块内的 controller、provider 的 onApplicationBootstrap 方法,然后调用 module 的 onApplicationBootstrap 方法

  • onModuleInit 需要实现 OnModuleInit 接口
  • onApplicationBootstrap 需要实现 OnApplicationBootstrap 接口

2. 应用销毁阶段

  1. 先调用每个模块的 controller、provider 的 onModuleDestroy 方法,然后调用 Module 的 onModuleDestroy 方法。

  2. 之后再调用每个模块的 controller、provider 的 beforeApplicationShutdown 方法,然后调用 Module 的 beforeApplicationShutdown 方法。

  3. 停止监听网络端口, 之后调用每个模块的 controller、provider 的onApplicationShutdown 方法,然后调用 Module 的 onApplicationShutdown方法。

  • onModuleDestroy 需要实现 OnModuleDestroy 接口
  • beforeApplicationShutdown 需要实现 BeforeApplicationShutdown 接口
  • onApplicationShutdown 需要实现 OnApplicationShutdown接口

beforeApplicationShutdownonApplicationShutdown 区别是,前者可以获取到 signal 系统信号的,比如 SIGTERM