I am supplying it for B, but Im not supplying it for A unless by supplying
it for B, I implicitly bind it to every place that expresses a dependency
on @Assisted ISOCOuntry .


On Fri, Jun 21, 2013 at 10:27 AM, Cédric Beust ♔ <[email protected]> wrote:

> It doesn't, you specified it as "@Assisted" so you are supplying it:
>
>      public B(A baseObject, @Assisted ISOCountry country) {
>
> --
> Cédric
>
>
>
> On Fri, Jun 21, 2013 at 10:20 AM, Puneet Lakhina <[email protected]
> > wrote:
>
>> But how does Guice find the ISOCountry to inject? There is no binding for
>> ISOCountry, neither does ISOCountry have a default constructor.
>>
>>
>> On Fri, Jun 21, 2013 at 4:36 AM, Stephan Classen <[email protected]>wrote:
>>
>>>  You have a constructor which is annotated with @Inject
>>> Guice finds this constructor (note that at most one constructor may be
>>> annotated with @Inject).
>>>
>>>
>>>
>>> On 06/20/2013 07:18 PM, Puneet Lakhina wrote:
>>>
>>> Thanks for your response Stephan. I still dont quite understand how
>>> guice is able to create an instance of A. A does not have a default
>>> constructor and I havent specified a provider or a binding for ISOCountry.
>>>
>>>
>>> On Thu, Jun 20, 2013 at 2:26 AM, Stephan Classen <[email protected]>wrote:
>>>
>>>> Guice does "just in time" binding if it encounters an injection point
>>>> which requests a type not bound.
>>>> Guice will look for an Constructor with @Inject annotation or a default
>>>> constructor in that type. When it encounters a matching constructor it will
>>>> add "just in time" a binding to the injector.
>>>>
>>>> I mostly try to avoid using just in time bindings because I like the
>>>> explicity of the bindings in my modules.
>>>>
>>>>
>>>>
>>>> On 06/20/2013 04:31 AM, Puneet Lakhina wrote:
>>>>
>>>>> HI,
>>>>>
>>>>> I am trying to migrate some existing code to guice and following is a
>>>>> self contained example of the setup I have:
>>>>>
>>>>> public class GuiceMailingListQuestion {
>>>>>
>>>>>     public static interface CountrySpecificArtifact {
>>>>>
>>>>>         public abstract ISOCountry getCountry();
>>>>>     }
>>>>>
>>>>>     public interface CountrySpecificArtifactFactory<T extends
>>>>> CountrySpecificArtifact> {
>>>>>         public T create(ISOCountry country);
>>>>>     }
>>>>>     public static abstract class Base<T> {
>>>>>     }
>>>>>     public static abstract class CountrySpecificBase<T> extends
>>>>> Base<T> implements CountrySpecificArtifact {
>>>>>         private ISOCountry country;
>>>>>
>>>>>         @Inject
>>>>>         public CountrySpecificBase(@Assisted ISOCountry country) {
>>>>>             this.country = country;
>>>>>         }
>>>>>         @Override
>>>>>         public ISOCountry getCountry() {
>>>>>             return country;
>>>>>         }
>>>>>         public String toString() {
>>>>>             return getClass().getSimpleName() + " country=" +
>>>>> country.getId();
>>>>>         }
>>>>>     }
>>>>>     public static class A extends CountrySpecificBase<String> {
>>>>>         @Inject
>>>>>         public A(@Assisted ISOCountry country) {
>>>>>             super(country);
>>>>>         }
>>>>>     }
>>>>>     public static class B implements CountrySpecificArtifact {
>>>>>         private ISOCountry country;
>>>>>         private A baseObject;
>>>>>         @Inject
>>>>>         public B(A baseObject, @Assisted ISOCountry country) {
>>>>>             this.country = country;
>>>>>             this.baseObject = baseObject;
>>>>>         }
>>>>>         @Override
>>>>>         public ISOCountry getCountry() {
>>>>>             return country;
>>>>>         }
>>>>>         public String toString() {
>>>>>             return "B country=" + country.getId() + " baseObject=" +
>>>>> baseObject.toString();
>>>>>         }
>>>>>     }
>>>>>     public static void main(String[] args) {
>>>>>         Injector i = Guice.createInjector(new AbstractModule() {
>>>>>             @Override
>>>>>             protected void configure() {
>>>>>                 install(new FactoryModuleBuilder().build(
>>>>>                         new
>>>>> TypeLiteral<CountrySpecificArtifactFactory<A>>() {}));
>>>>>                 install(new FactoryModuleBuilder().build(
>>>>>                         new
>>>>> TypeLiteral<CountrySpecificArtifactFactory<B>>() {}));
>>>>>             }
>>>>>         });
>>>>>         System.out.println(i.getInstance(Key.get(new
>>>>> TypeLiteral<CountrySpecificArtifactFactory<B>>(){})).create(NFCountry.US));
>>>>>         System.out.println(i.getInstance(Key.get(new
>>>>> TypeLiteral<CountrySpecificArtifactFactory<B>>(){})).create(NFCountry.MX));
>>>>>     }
>>>>> }
>>>>>
>>>>>
>>>>> The part that surprises me about the above example is how does it work
>>>>> at all? When I try to create a B using the CountrySpecificArtiFactory<B> ,
>>>>> how does guice figure out how to create an A to pass to B's constructor.
>>>>> All I have told guice is how to create CountrySpecificArtifactFactory<A>
>>>>> not how to create A.
>>>>>
>>>>> Can you explain why this works at all?
>>>>>
>>>>> --
>>>>> 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.
>>>>> 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.
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>>
>>>>
>>>
>>>
>>>  --
>>> Regards,
>>> Puneet
>>>
>>>  --
>>> 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.
>>> 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.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
>>
>> --
>> Regards,
>> Puneet
>>
>>  --
>> 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.
>> 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.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>



-- 
Regards,
Puneet

-- 
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.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to