Providers are singleton objects that can be injected, for example, into other services, controllers and directives. All providers are registered using different "recipes", where
Provider is the most flexible one. All possible recipes are:
Services, Factories and Providers are all lazy initialized, component is initialized only if application depends on it.
Decorators are closely related to Providers. Decorators are used to intercept service or factory creation in order to change it's behavior or override (parts of) it.