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.