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
> 
>       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
>> 
>> 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 [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.


Reply via email to