Fixing the binding order problem. My strategy was to break binding creation into two steps:
- creating the binding itself
- "initializing" the binding, ie. validating the bindings dependencies
This CL is a start of something that we could go further on. In particular, we could change the @ProvidedBy etc. bindings to use a BindingImpl.initialize() method uniformly to separate creating the binding from building its dependencies.
git-svn-id: https://google-guice.googlecode.com/svn/trunk@473 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/src/com/google/inject/BindCommandProcessor.java b/src/com/google/inject/BindCommandProcessor.java
index 1ab63c6..59db4b9 100644
--- a/src/com/google/inject/BindCommandProcessor.java
+++ b/src/com/google/inject/BindCommandProcessor.java
@@ -158,18 +158,25 @@
return null;
}
+ // This cast is safe after the preceeding check.
+ @SuppressWarnings("unchecked")
+ Class<T> clazz = (Class<T>) type;
+ final BindingImpl<T> binding;
+ try {
+ binding = injector.createUnitializedBinding(clazz, scope, source);
+ createBinding(source, shouldPreload, binding);
+ } catch (ResolveFailedException e) {
+ injector.errorHandler.handle(source, e.getMessage());
+ createBinding(source, shouldPreload, invalidBinding(injector, key, source));
+ return null;
+ }
+
untargettedBindings.add(new Runnable() {
public void run() {
- // This cast is safe after the preceeding check.
- @SuppressWarnings("unchecked")
- Class<T> clazz = (Class<T>) type;
-
try {
- BindingImpl<T> binding = injector.createBindingFromType(clazz, scope, source);
- createBinding(source, shouldPreload, binding);
+ injector.initializeBinding(binding);
} catch (ResolveFailedException e) {
injector.errorHandler.handle(source, e.getMessage());
- createBinding(source, shouldPreload, invalidBinding(injector, key, source));
}
}
});