使用Guice连接具有属性的库对象

时间:2015-12-22 14:48:28

标签: java guice

我需要从库中将参数注入到对象(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) {
       ....
    }
    ....
 }

如果没有能够注释源以从属性文件中注入参数,可以做些什么? 谢谢!

2 个答案:

答案 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”的类的缺点是该对象不符合拦截条件。但是,您的带注释的子类可能会被截获。然后,如果你需要更改实现,你没有在你的代码中引用你的子类,只引用了你想要注入的具体类。