The forRoot() static method is a convention that makes it easy for developers to configure services and providers for a module which are intended to be singletons. For services it is preferable to specify providedIn: 'root' on the service's @Injectable(), which has the same effect.
... (rest)
Application-wide providers should be defined by specifying providedIn: 'root' on their @Injectable() decorator (in the case of services) or at InjectionToken construction (in the case of tokens being provided). Providers created this way will automatically be made available to the entire application and don't need to be listed in any module.
If a provider cannot be configured in this way (perhaps because it has no sensible default value), then register it in the root AppModule, not in the AppComponent.
... (rest)
Preferably, providers should be configured using @Injectable syntax (link). If at all possible, they should be provided in the application root (providedIn: 'root'). Services configured this way may still end up being lazily loaded if they are only used from a lazily loaded context.
If it's the consumer's decision of a provider whether it should be application-wide or not, then prefer registering providers in modules (@NgModule.providers) to registering in components (@Component.providers).
... (rest)