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.
