While writing, I considered notifying a ProvisionListener to still be "part of the construction". I remember wondering about this specific part (whether the finally should be inside or outside), and ended up settling on "outside". But, I can't really give you any concrete reason of why I settled on that.
There's a few different places we notify provision listeners (and I added one more internally, to notify on toInstance/bindConstant bindings too... still waiting on the sync-stuff to be fixed to push that out), so I'd have to analyze all of them to really figure it out. sam On Thu, Mar 7, 2013 at 10:12 AM, Stuart McCulloch <[email protected]> wrote: > On 7 Mar 2013, at 13:39, [email protected] wrote: > > Hummm.... It doesn't seem to work! Maybe I'm missing something? > > > Unfortunately not - by tracing through your test I can see it still hits > the issue with the constructionContext reference since that's only removed > after all the provisioning hooks are done. I'm wondering whether it makes > sense to move the reference removal into a finally block in the provision > method - ie. after custom injection and injection listeners, but before all > the provision hooks have completed. This fixes your testcase and all the > unit tests still pass, but I'd need to do more thorough investigation into > whether this could cause problems elsewhere. (Would appreciate Sam's input > since he wrote the ProvisionListener feature.) > > diff --git a/core/src/com/google/inject/internal/ConstructorInjector.java > b/core/src/com/google/inject/internal/ConstructorInjector.java > index e71a25a..8f86db5 100644 > --- a/core/src/com/google/inject/internal/ConstructorInjector.java > +++ b/core/src/com/google/inject/internal/ConstructorInjector.java > @@ -94,7 +94,6 @@ final class ConstructorInjector<T> { > }); > } > } finally { > - constructionContext.removeCurrentReference(); > constructionContext.finishConstruction(); > } > } > @@ -125,6 +124,8 @@ final class ConstructorInjector<T> { > : userException; > throw errors.withSource(constructionProxy.getInjectionPoint()) > .errorInjectingConstructor(cause).toException(); > + } finally { > + constructionContext.removeCurrentReference(); > } > } > } > > https://gist.github.com/electrotype/5108107 > > I use : > > <dependency> > <groupId>org.sonatype.sisu</groupId> > <artifactId>sisu-guice</artifactId> > <version>3.1.3</version> > </dependency> > > <dependency> > <groupId>org.sonatype.sisu.inject</groupId> > <artifactId>guice-assistedinject</artifactId> > <version>3.1.3</version> > </dependency> > > Thank you. > > On Wednesday, March 6, 2013 9:59:28 PM UTC-5, Stuart McCulloch wrote: >> >> You might want to look at the ProvisionListener hook that's been added in >> trunk: >> >> https://groups.google.com/d/**msg/google-guice/wRPmutuepmM/**5TbMHMm3wJUJ<https://groups.google.com/d/msg/google-guice/wRPmutuepmM/5TbMHMm3wJUJ> >> >> http://code.google.com/p/**google-guice/issues/detail?id=**78#c16<http://code.google.com/p/google-guice/issues/detail?id=78#c16> >> >> It lets you intercept after an instance has been completely provisioned >> (ie. fully injected, including circular proxies) but before it's returned >> from the injector to the caller. >> >> On 7 Mar 2013, at 02:44, [email protected] wrote: >> >> First, here's a unit test for the issue : https://gist.github.com/** >> electrotype/5105100 <https://gist.github.com/electrotype/5105100> >> >> I'm trying to use a listener to call an "init()" method on my classes >> when they are constructed. I also use AssistedInject factories. >> >> I think the problem is that in *com.google.inject.internal. >> ConstructorInjector#construct(...)* , this code is supposed to prevent >> infinite loops : >> >> >> T t = constructionContext.**getCurrentReference(); >>> if (t != null) { >>> return t; >>> } >>> >> >> To remove the "current reference", *removeCurrentReference()* is called >> in the *finally* clause : >> >> >> } finally { >>> constructionContext.**removeCurrentReference(); >>> } >>> >> >> The problem is that before this removal method is called, *the listeners >> are called* : >> >> membersInjector.**notifyListeners(t, errors); >>> >> >> >> It seems that this is the root of my issue, because the reference still >> exists when my "init()" methods are called (via the listeners), so when >> they try to create an instance using the factories, they get the cached >> instance instead of a new one! >> >> Does this mean I can't use a listener to call my init() methods? Are >> there some workarounds? >> >> Thanks in advance! >> >> >> >> >> >> >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "google-guice" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to google-guice...@**googlegroups.com. >> To post to this group, send email to [email protected]. >> Visit this group at >> http://groups.google.com/**group/google-guice?hl=en<http://groups.google.com/group/google-guice?hl=en> >> . >> For more options, visit >> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >> . >> >> >> >> >> > -- > You received this message because you are subscribed to the Google Groups > "google-guice" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/google-guice?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > > > > -- > You received this message because you are subscribed to the Google Groups > "google-guice" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/google-guice?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- You received this message because you are subscribed to the Google Groups "google-guice" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-guice?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
