我需要从库中将参数注入到对象(Template
)的构造函数中,这意味着我无法对该对象进行注释。构造函数参数从属性文件加载:
foo=value1
bar=value2
public class MyModule extends AbstractModule {
private Properties properties;
public void configure() {
Names.bindProperties(binder(), getProperties());
bind(Template.class);
}
public Properties getProperties() {
if (properties == null) {
loadProperties();
}
return properties;
}
private loadProperties() {
...
}
....
}
如果我有Template的源代码,我会注释它的构造函数:
public class Template {
@Inject
public Template(@Named("foo") String foo, @Named("bar") String bar) {
....
}
....
}
如果没有能够注释源以从属性文件中注入参数,可以做些什么? 谢谢!
答案 0 :(得分:3)
在模块中使用Provider方法:
@Provides
public Template newTemplate(@Named("foo") String foo, @Named("bar") String bar) {
return new Template(foo, bar);
}
注意:正如Nathan所说,这种方法不允许在模板实例上使用guice,因为它不是由guice创建的。如果这很重要,您将不得不使用子类。
答案 1 :(得分:2)
您可以对对象进行子类化,然后注释子类的构造函数。然后你可以将类绑定到你的子类。使用提供程序方法创建具有“new”的类的缺点是该对象不符合拦截条件。但是,您的带注释的子类可能会被截获。然后,如果你需要更改实现,你没有在你的代码中引用你的子类,只引用了你想要注入的具体类。