Play's runtime dependency injection support is built on JSR-330, which provides a specification for declaring how
dependencies get wired to components. JSR-330 however does not address how components are provided to or located
by a DI container. Play's API seeks to address this in a DI container agnostic way.

The reason for providing this abstraction is so that Play, the modules it provides, and third party modules can all
express their bindings in a way that is not specific to any one DI container.

Components are bound in the DI container. Each binding is identified by a BindingKey, which is
typically an interface that the component implements, and may be optionally qualified by a JSR-330 qualifier
annotation. A binding key is bound to a BindingTarget, which describes how the implementation
of the interface that the binding key represents is constructed or provided. Bindings may also be scoped using
JSR-330 scope annotations.

traitApplicationLifecycle extends AnyRef

Application lifecycle register.

This is used to hook into Play lifecycle events, specifically, when Play is stopped. The reason Play only provides
lifecycle callbacks for stopping is that constructors are considered the application start callback. This has
several advantages:

- It simplifies implementation, if you want to start something, just do it in the constructor.
- It simplifies state, there's no transitional state where an object has been created but not started yet. Hence,
as long as you have a reference to something, it's safe to use it.
- It solves startup dependencies in a type safe manner - the order that components must be started is enforced by the
order that they must be instantiated due to the component graph.

Stop hooks are executed when the application is shutdown, in reverse from when they were registered. Due to this
reverse ordering, a component can know that it is safe to use the components it depends on as long as it hasn't
received a shutdown event.

To use this, declare a dependency on ApplicationLifecycle, and then register the stop hook when the component is
started. For example: