服务
广义:包括应用所需的任何值、函数或特性
狭义:一个明确定义了用途的类。它应该做一些具体的事,并做好。
服务类比java中的业务类, 组件类比java中的Controller
Angular 只会通过依赖注入来帮你更容易地将应用逻辑分解为服务,并让这些服务可用于各个组件中。服务可以依赖其他服务。
与java类比: spring项目中拆分的业务模块,一个服务就类比一个Service接口类,依赖注入类比Spring中的依赖注入,
import ... from ..Service
constructor(private xxxService : xxxService)
类比Spring中的构造注入
依赖注入(DI)
依赖不一定是服务,它还可能是函数或值
组件是服务的消费者,你可以把一个服务注入到组件中,让组件得以访问该服务类。
用@Injectable() 装饰器把类定义为服务,并为其提供元数据。
把服务注入到组件,那就有个概念叫做注入器
- 注入器是主要的机制。Angular会在启动过程中创建全应用级注入器以及所需的其他注入器。不用自己创建注入器。
- 注入器会创建以来、维护一个容器来管理这些以来,并尽可能的复用它们
- 提供者是一个对象,用来告诉注入器应该如何获取或创建依赖
当Angular发现某个组件依赖某个服务时,它会首先检查是否该注入器中已经有了那个服务的任何现有实例。如果所请求的服务尚不存在,注入器就会用以前注册的服务提供者来制作一个,并把它加入注入器中,并把该服务返回给Angular。
当所有请求的服务已解析并返回时,Angular可以用这些服务实例为参数,调用组件的构造函数。
提供服务
对应要用的任何服务,必须至少注册一个提供者
- 服务在自己的元数据中把自己注册为提供者,让服务随处可用
@Injectable({
provideIn: 'root'
})
- 服务在组件中注册提供者,该组件的每一个新实例会提供一个该服务的新实例
@Component({
selector: 'app-hero-list',
templateUrl: './hero-list.component.html',
providers: [HeroService]
})
- 使用特定的NgModule注册提供者,该服务的同一个实例将会对该NgModule中的所有组件可用,“单例”
@NgModule({
providers: [
BackendService, Logger
]
})