I agree I would expect  @Assisted to be ignored. Now it depends in ISOCounty. Unfortunatly the source is not in the example.



On 06/21/2013 08:54 PM, Cédric Beust ♔ wrote:
Indeed. This is weird:

        @Inject
        public CountrySpecificBase(@Assisted ISOCountry country) {
            this.country = country;
        }

Christian, what does this do exactly? I've never seen a combination of @Inject with a single @Assisted. I assume it would be completely ignored here since it's not being used in an injected factory?


-- 
Cédric



On Fri, Jun 21, 2013 at 10:41 AM, Puneet Lakhina <puneet.lakh...@gmail.com> wrote:
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 ♔ <ced...@beust.com> 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 <puneet.lakh...@gmail.com> 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 <st.clas...@gmx.ch> 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 <st.clas...@gmx.ch> 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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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 google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
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