我有一个类,我在其中声明了我的静态常量:
public final class ConfigOptions {
public static final String FILE_PATH_SERVER = "/home/user/me/somefile";
}
然后我使用Guice将其绑定在ServletModule
:
public class MyServletModule extends ServletModule {
bind(String.class).annotatedWith(Names.named("filePath"))
.toInstance(ConfigOptions.FILE_PATH_SERVER);
// Also tried
// bindConstant().annotatedWith(Names.named("filePath")).to(ConfigOptions.FILE_PATH_SERVER)
// ... other bindings
}
我的GuiceServletContextListener
:
public class MyServletContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyServletModule());
}
}
最后,我尝试使用filePath
:
public class MyClass {
@Inject
@Named("filePath")
private String filePath;
public MyClass() { ... }
public void doSomething() {
someotherThing.setFilePath(filePath); // But filePath is null
}
}
我主要使用here显示的方法,但不确定我是否遗漏了某些内容。
此外,我确保导入了正确的import com.google.inject.name.Named
。
答案 0 :(得分:5)
确认您让Guice创建MyClass实例,而不是使用new MyClass()
自行实例化它们。即使字段标有@Inject
,Guice也只能设置值,如果Guice负责创建包含它的实例*。通过现场注入,如果从未通过注入器请求类,则该字段将静默保持为空。
切换到构造函数注入也有助于明确是否通过Guice提供类,因为更改构造函数本身会破坏任何直接调用而不会破坏Guice创建的引用:
public class MyClass {
private final String filePath;
@Inject public MyClass(@Named("filePath") String filePath) {
this.filePath = filePath;
// ...
}
// ...
}
*您也可以使用Injector.injectMembers(instance)或Binder.requestInjection(instance)向Guice注入现有实例。这些并不常见,并且可能使您难以遵循构造和注入实例的位置,但在遗留代码和其他一些情况下可能会很有用。