假设我们有以下代码:
public interface Rock {
// Minerals are a concrete class; omitted for brevity
public Minerals getMinerals();
}
public class Granite implements Rock {
// @Inject #1 - field
private Minerals minerals;
// @Inject #2 - constructor
public Granite(Minerals mins) {
super();
setMinerals(mins);
}
public Minerals getMinerals() {
return minerals;
}
// @Inject #3 - setter
public void setMinerals(Minerals mins) {
minerals = mins
}
}
public class RockModule extends AbstractModule {
public void configure(Binder guiceBinder) {
Minerals m = new Minerals(true, 3, MineralEnum.Sedimentary);
guiceBinder.bind(Minerals.class).toInstance(m);
guiceBinder.bind(Rock.class).to(Granite.class);
}
}
public class TestInjections {
public static void main(String[] args) {
RockModule mod = new RockModule();
Injector injector = Guice.createInjector(mod);
Granite gran = injector.getInstance(Granite.class);
}
}
我已经注释掉了 3 个@Inject
注释,因为它们是这里的变量——我想知道 Guice 在所有 3 种情况下(字段级、构造函数级或设置器级注入)的行为方式。
Granite
实例是否总是注入Minerals
模块中配置的实例?注入类型(三种中的每一种)如何影响Granite
注入器返回的实例 - 还是它们都相同?- 如果我根本没有
Minerals
在模块中显式绑定并且Minerals
没有定义公共的无参数构造函数怎么办?对于所有三种注入场景,Guice 如何实例化Minerals
要为请求Granite
对象返回的实例?