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
<mailto: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
<mailto:google-guice%2bunsubscr...@googlegroups.com>.
To post to this group, send email to
google-guice@googlegroups.com
<mailto: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
<mailto:google-guice%2bunsubscr...@googlegroups.com>.
To post to this group, send email to google-guice@googlegroups.com
<mailto: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.