导入含服务的模块后,应用内所有组件是否共享同一服务实例?
Angular服务实例与模块导入的常见疑问解答
一、模块providers定义的服务,根模块导入后是否全局单例?
不一定,核心取决于模块的加载类型:
- 若该模块是非懒加载模块,且在根模块AppModule中导入,那么模块providers数组内的服务会被提升至根注入器,全应用内所有非懒加载模块的组件都会共享这一个服务实例。
- 若该模块被懒加载模块单独导入,懒加载模块会创建独立的注入器,此时模块providers里的服务会在这个独立注入器中生成新实例,和根注入器的实例不共享。
二、CoreModule导入HttpClientModule后,为何全应用都能访问HttpClient?
本质是因为HttpClientModule的服务默认注册在根注入器:
Angular的核心模块如HttpClientModule,其内部的HttpClient服务使用了@Injectable({ providedIn: 'root' })装饰器,这种方式会直接把服务注册到根注入器。
当你在CoreModule中导入HttpClientModule,再将CoreModule导入根模块AppModule时,HttpClientModule的服务注册逻辑会被执行,最终把HttpClient的单例实例存入根注入器。而根注入器是全应用共享的,所以AppModule下所有非懒加载模块、组件都能获取到同一个HttpClient实例。
额外建议:自己开发服务时,优先使用@Injectable({ providedIn: 'root' })来声明全局单例,比把服务放在模块providers里更可靠,能避免懒加载模块导致的多实例问题。
内容的提问来源于stack exchange,提问作者user19297279
相关产品推荐
相关产品推荐

