Guice 私有父模块公开绑定到子模块
Guice private parent Module expose binding to child modules
我有以下 Guice 私有模块依赖树:
public class FooModule extends PrivateModule {
@Override
protected void configure() {
install(new BarModule());
bind(Person.class);
expose(Person.class);
}
}
public class BarModule extends PrivateModule {
@Override
protected void configure() {
install(new LifeImplModule());
bind(Animal.class);
expose(Animal.class);
}
}
public class LifeImplModule extends PrivateModule {
@Override
protected void configure() {
bind(Life.class).toInstance(new LifeImpl());
expose(Life.class);
}
}
public class Animal {
@Inject
public Animal(Life life) {
//
}
}
public class Person {
@Inject
public Person(Life life) {
//
}
}
现在,当我执行 Guice.createInjector(new FooModule()).getInstance(Person.class)
时 - 它失败了,因为它无法识别 Life.class
的绑定,而 Guice.createInjector(new FooModule()).getInstance(Animal.class)
有效,因为它通过 [= 绑定了 Life
15=].
我该如何解决这个问题?我试着移动
install(new LifeImplModule());
到 FooModule()
但 Animal.class
不起作用,而 Person.class
起作用。
谁能解释一下 Guice 私有模块在继承绑定方面是如何工作的? FooModule
中的 install(LifeImplModule())
对 Person.class
和子模块 BarModule()
都不起作用吗?
由于BarModule
是一个私有模块,安装在里面的任何模块都不能对外使用。
这就是为什么
install(new LifeImplModule());
不授予对 FooModule
的 Life
绑定的访问权限。
您可以通过从 BarModule
显式公开 Life
来解决它
install(new LifeImplModule());
expose(Life.class);
我有以下 Guice 私有模块依赖树:
public class FooModule extends PrivateModule {
@Override
protected void configure() {
install(new BarModule());
bind(Person.class);
expose(Person.class);
}
}
public class BarModule extends PrivateModule {
@Override
protected void configure() {
install(new LifeImplModule());
bind(Animal.class);
expose(Animal.class);
}
}
public class LifeImplModule extends PrivateModule {
@Override
protected void configure() {
bind(Life.class).toInstance(new LifeImpl());
expose(Life.class);
}
}
public class Animal {
@Inject
public Animal(Life life) {
//
}
}
public class Person {
@Inject
public Person(Life life) {
//
}
}
现在,当我执行 Guice.createInjector(new FooModule()).getInstance(Person.class)
时 - 它失败了,因为它无法识别 Life.class
的绑定,而 Guice.createInjector(new FooModule()).getInstance(Animal.class)
有效,因为它通过 [= 绑定了 Life
15=].
我该如何解决这个问题?我试着移动
install(new LifeImplModule());
到 FooModule()
但 Animal.class
不起作用,而 Person.class
起作用。
谁能解释一下 Guice 私有模块在继承绑定方面是如何工作的? FooModule
中的 install(LifeImplModule())
对 Person.class
和子模块 BarModule()
都不起作用吗?
由于BarModule
是一个私有模块,安装在里面的任何模块都不能对外使用。
这就是为什么
install(new LifeImplModule());
不授予对 FooModule
的 Life
绑定的访问权限。
您可以通过从 BarModule
Life
来解决它
install(new LifeImplModule());
expose(Life.class);