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.


Reply via email to