Tho*_*sen 19 dependency-injection dagger
编辑 2018-02-08:示例项目演示如何在https://github.com/ravn/dagger2-named-string-inject-example执行此操作- 注意:整个源代码在一个文件中!
我正在研究dagger是否能为我们取代guice(因为我们的部署Java平台很慢).
我在运行时构建了配置字符串的映射,我希望根据需要使用dagger.
如果我有
java.util.Map<String, String> map = new java.util.TreeMap<String, String>();
map.put("key", "value");
Run Code Online (Sandbox Code Playgroud)
和
@Inject
Thermosiphon(Heater heater, @Named("key") String value) {
this.heater = heater;
System.out.println("value =" + value);
}
Run Code Online (Sandbox Code Playgroud)
我希望注入价值"价值".
源代码中的示例没有任何@Named用法.只是尝试给出以下异常:
Exception in thread "main" java.lang.IllegalStateException: Errors creating object graph:
No binding for @javax.inject.Named(value=key)/java.lang.String required by class bar.Thermosiphon
at dagger.internal.ThrowingErrorHandler.handleErrors(ThrowingErrorHandler.java:34)
at dagger.internal.Linker.linkRequested(Linker.java:146)
at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:288)
at dagger.ObjectGraph$DaggerObjectGraph.get(ObjectGraph.java:249)
at app.CoffeeApp.main(CoffeeApp.java:20)
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
Chr*_*ber 18
听起来你有一个Map,你想要使用一些将这些自动绑定到命名字符串的东西.您不能像在Guice中那样在Dagger中自动执行此操作,因为在Guice中您可以创建属性绑定器.
Dagger需要在编译时知道所有绑定,以便进行分析以确保满足所有绑定和依赖关系
也就是说,你可以做这样的事情 - 它更像锅炉板,但它是合法的.
@Module(library = true)
public class PropertiesModule {
public final Properties props;
PropertiesModule(Properties props) {
this.props = props;
}
@Provides @Named("property.one") String providePropertyOne() {
props.getProperty("property.one", "some default");
}
@Provides @Named("property.two") String providePropertyTwo() {
props.getProperty("property.two", "some other default");
}
...
}
Run Code Online (Sandbox Code Playgroud)
这将允许您需要创建所有的hte绑定,但要从运行时值中得到满足.但是,这些键在编译时是已知的(并且必须是,因为你在代码中使用了@Named("string literal").哎呀,如果你已经定义了属性名称并且默认为常量字符串,你甚至可以做:
@Provides @Named(PROPERTY_NAME_CONSTANT) String a() {
props.getProperty(PROPERTY_NAME_CONSTANT, PROPERTY_NAME_CONSTANT_DEFAULT);
}
Run Code Online (Sandbox Code Playgroud)
它是更多的锅炉板,但Dagger,虽然试图消除很多锅炉板,优先编制时分析绝对锅炉板减少.也就是说,我将提出一个可以改善这种情况的功能,从已知列表中自动生成系统属性的模块,或者其他类似的功能.我想即使这个锅炉板也可以减少.
jfr*_*rey 14
您必须在@Named实例的dagger模块中定义提供程序.
@Provides @Named("foo") String provideFoo()
{
return "foo string";
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在构造函数中注入命名实例,或者在依赖类中使用字段注入.
public class Thermosiphon
{
@Inject @Named("foo") String fooString;
@Inject public Thermosiphon(Heater heater)
{
System.out.println("value of fooString is " + fooString);
}
}
Run Code Online (Sandbox Code Playgroud)