We've run into a similar situation for "settings". These are settings that aren't required at construction time, are a bit expensive to initialize, can change through the course of the program, and allow other parts of the program programmatic access to changing them. We've gone through a few ways of solving it, but I think have stumbled upon a good one.
The first approach we took was to have a FooSettings interface that had a bunch of getXXX methods and could be implemented in a variety of ways. The components that required the settings' values would have a FooSettings injected and the place that had the actual setting implementations would create a BarBackedFooSettingsImpl class. This worked, but it was a PITA to deal with the different implementations of FooSettings, and became unwieldy if the settings were unrelated and required in lots of different places.
The next attempt was to inject a "Setting" class directly, which was more in the right approach, but exposed too much information to the users. The users really just want to "get", but Setting exposed a set, revertToDefault, and a lot of other unrelated methods.
The solution we're using now is with a new MutableProvider interface. MutableProvider extends Provider and add a set(T) method. Things that need access to the getter just inject the Provider of the setting type (annotated with some binding annotation that's unique for the setting). Things that need access to both the setter and getter can inject the MutableProvider of the type (also annotated with a unique binding annotation). The Provider version of the setting is bound by using toProvider, and the MutableProvider is bound to the same instance or key.
While this doesn't solve your question about scopes, it does let what's returned by a Provider change asynchronously.
Sam