Issue 353 in google-guice: Strange behavior on Inject Injector instance in Constructor

0 views
Skip to first unread message

codesite...@google.com

unread,
Apr 11, 2009, 6:16:53 AM4/11/09
to google-g...@googlegroups.com

Comment #3 on issue 353 by tregubov: Strange behavior on Inject Injector
instance in Constructor
http://code.google.com/p/google-guice/issues/detail?id=353

I create little Example with BAG. You can see it in attachment.

You can reproduce the Bag here
static class ChildService1Impl implements ChildService1
{
@Inject
public ChildService1Impl(Injector injector) /*BAG*/
// public ChildService1Impl(Injector injector,ChildService2Impl
childService2)
/*ALL WORK*/
{
System.out.println(injector.getParent());
}
}

When You in /*BAG*/ version you got null in System.out. Mean Root Injector
But when you run /*ALL WORK*/ version you got

Injector[bindings=[ProviderInstanceBinding[key=Key[type=com.google.inject.Injector,
annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE,
provider=Provider<Injector>],
ProviderInstanceBinding[key=Key[type=java.util.logging.Logger,
annotation=[none]],
source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider<Logger>],
InstanceBinding[key=Key[type=com.google.inject.Stage, annotation=[none]],
source=[unknown source], instance=DEVELOPMENT],
ProviderInstanceBinding[key=Key[type=ru.faulab.fmsgenerator.GuiceBagExample$IRootServ
iceFactory, annotation=[none]],
source=ru.faulab.fmsgenerator.GuiceBagExample$RootSubModule1.configure(GuiceBagExampl
e.java:52), scope=Scopes.SINGLETON,
provider=ru.faulab.fmsgenerator.GuiceBagExample$IRootServiceFactory for
ru.faulab.fmsgenerator.GuiceBagExample$IRootServiceImpl],
LinkedKeyBinding[key=Key[type=ru.faulab.fmsgenerator.GuiceBagExample$IRootService2,
annotation=[none]],
source=ru.faulab.fmsgenerator.GuiceBagExample$RootSubModule2.configure(GuiceBagExampl
e.java:60), scope=Scopes.SINGLETON,
target=Key[type=ru.faulab.fmsgenerator.GuiceBagExample$IRootService2Impl,
annotation=[none]]]]] in System Out. Mean Child Injector

Attachments:
GuiceBagExample.java 3.0 KB

--
You received this message because you are listed in the owner
or CC fields of this issue, or because you starred this issue.
You may adjust your issue notification preferences at:
http://code.google.com/hosting/settings

codesite...@google.com

unread,
Apr 11, 2009, 1:16:28 PM4/11/09
to google-g...@googlegroups.com
Updates:
Status: Invalid

Comment #4 on issue 353 by limpbizkit: Strange behavior on Inject Injector

If you read the doc carefully for createChildInjector(), it suggests that
the binding for GUI will live in the top-
level injector:
"Just-in-time bindings created for child injectors will be created in an
ancestor injector whenever possible.
This allows for scoped instances to be shared between injectors. Use
explicit bindings to prevent bindings
from being shared with the parent injector."

The solution is to use an explicit binding for GUI. In your child injector,
add this statement:
bind(GUI.class);

http://google-guice.googlecode.com/svn/trunk/latest-
javadoc/com/google/inject/Injector.html#createChildInjector(com.google.inject.Module...)

codesite...@google.com

unread,
Apr 11, 2009, 1:35:35 PM4/11/09
to google-g...@googlegroups.com

Comment #5 on issue 353 by tregubov: Strange behavior on Inject Injector

thank you very much. I miss this section. Thank for solution.

codesite...@google.com

unread,
Apr 11, 2009, 1:53:39 PM4/11/09
to google-g...@googlegroups.com

Comment #6 on issue 353 by tregubov: Strange behavior on Inject Injector

thank you very much. I miss this section, but it not so obvious (IMHO). But
i don't
understand your solustion. If i wrote as you say bind(GUI.class);, i lost
ability to
get instance by interface like injector.getInstance(XUI.class). (GUI
extends JFrame
implements XUI).

So i have only one way, as i understand, use unnecessary dependency. :(

Reply all
Reply to author
Forward
0 new messages