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.


Reply via email to