Angular 7中依赖注入(DI)与HttpClient的注入逻辑疑问
关于Angular 7中HttpClient可注入性的疑问解答
嘿,刚接触Angular的话,这个问题其实挺关键的,我来给你把逻辑捋得明明白白~
首先得明确Angular依赖注入(DI)的核心规则:一个类要能被DI系统实例化并注入,必须被标记为“可注入”,而标记的方式主要是通过@Injectable()装饰器。
为什么HttpClient是可注入的?
HttpClient是Angular官方内置的HTTP服务,它本身已经被Angular团队用@Injectable()装饰器标记了。如果你去看它的源码,会看到类似这样的定义:
@Injectable({ providedIn: 'root' }) export class HttpClient { // 内部实现逻辑... }
这里的providedIn: 'root'是Angular提供的便捷配置,它表示这个服务会被注册到根注入器,整个应用中只会存在一个HttpClient实例,而且不需要你手动在模块的providers数组里声明它。
怎么判断一个类是否可注入?
可以通过两个简单的方式来判断:
- 看装饰器:直接查看类的定义,只要它带有
@Injectable()装饰器(不管是你自己写的服务还是Angular内置的),就说明它是为DI设计的,能够被注入。 - 查模块依赖:对于Angular内置服务,你需要确认是否导入了对应的模块——比如HttpClient就需要你在AppModule(或者你的功能模块)中导入
HttpClientModule,只有导入了这个模块,DI系统才能找到HttpClient的实例并完成注入(官方文档也会明确标注这类内置服务的使用前提)。
回到你的注入代码
你写的constructor(private http: HttpClient) { }之所以能生效,是因为两个前提都满足了:
- HttpClient本身带有
@Injectable()装饰器,告诉DI系统这个类可以被实例化; - 你已经在模块中导入了
HttpClientModule,这个模块负责把HttpClient的实例注册到DI系统中,当组件/服务的构造函数声明需要HttpClient时,DI系统就会自动把实例传递进去。
小提示
如果你自己写服务,记得一定要给它加上@Injectable()装饰器,否则DI系统会报错哦~
内容的提问来源于stack exchange,提问作者2727
相关产品推荐
相关产品推荐

