如何在Guice中创建可选绑定?

gub*_*bby 3 java dependency-injection guice

这是我的客户:

class Client {
    @Inject(optional=true) Service service;
}
Run Code Online (Sandbox Code Playgroud)

有时不需要Service,并且我们在JVM启动时(即在绑定器运行之前)知道该信息.如何使绑定可选?如果我根本没有指定绑定,它会尝试新建服务(并且因为没有零参数构造函数而失败:" 在package.Client.service(Service.java:40)注入时出错:找不到package.Service中的合适构造函数. "),我不能这样做:

binder.bind(Service.class).toInstance(null);
Run Code Online (Sandbox Code Playgroud)

因为Guice似乎不允许空值.有任何想法吗?

Col*_*inD 7

你在使用Guice 2.0吗?我已经尝试了这两个Service作为一个接口(服务字段总是null)和它是一个类(null如果它不能创建一个带有JIT绑定的新实例,如果它可以创建一个实例).两者看起来都像你期望的那样.

在这两种情况下,我都没有使用类似的绑定bind(Service.class).toInstance(null).如果这样做,那么您需要确保所有注入点都Service指定它们允许它null.这可以通过使用任何注释@Nullable(您可以自己创建或使用现有注释)来注释注入点来完成:

class Client {
    @Inject @Nullable Service service;
}
Run Code Online (Sandbox Code Playgroud)