是否有简单的方法将简单的原始类型参数(string和int)注入bean?
我需要的是从spring.xml中找到类似这样的东西:
<bean id="aBean" ...>
<property name="fieldName" value="aStringValue"/>
<property name="anotherFieldName" value="123"/>
</bean>
值可以是构造函数注入,字段注入或方法注入,但我不想为需要传递给bean的每个值使用单独的命名注释或工厂或提供者。
编辑:我的解决方案
这是我最终来到的。我认为它最接近我正在寻找的东西,但任何改进都会受到欢迎。
我发现在模块中,我可以声明一个提供者方法并使用它来设置我需要的任何属性:
MyModule extends AbstractModule{
...
@Provides @Named("testBean") MyTestBean createTestBean(MembersInjector<TestBean> mi){
TestBean test = new TestBean();
mi.injectMembers(test);
test.setFieldName("aStringValue");
test.setAnotherFieldName(123);
return test;
}
...
}
好处是,Provide方法替换了bean的bind(),这样实际的行数不会增加太多。
我仍然不能100%确定任何副作用,但看起来很有希望。
答案 0 :(得分:1)
有一种用于注入属性的内置机制。
属性文件:
name=jan
city=hamburg
模块
@Override
protected void configure() {
Names.bindProperties(binder(), properties);
}
然后在你的bean中,只需按名称注入
class Customer {
@Inject
@Named("name")
String name;
....
}
答案 1 :(得分:0)
有几种不同的方法可以做到这一点,包括你的方式。使用Provider方法的唯一缺点是它本质上是一个手动工厂,你必须记住要维护。 (在这种特殊情况下,你也没有获得构造函数注入的好处。)
如果没有Provider方法,则必须使用某种绑定注释。如果@Named不适合您,那么您需要为每个绑定创建一个注释。
bindConstant().annotatedWith(FieldName.class).to("aStringValue");
public SomeClass {
public void setFieldName(@FieldName String fieldname) {}
}
在某些情况下,这可能需要为每个基本/ String实例绑定一对一的注释。但我尝试使我的注释与所描述的实际实例有些正交,而宁愿使用注释来描述绑定对象和注入点之间的关系。
并不总是可行,但是可以通过单个绑定注释来描述整组相关基元,只要每个基元类型仅在集合中使用一次。所以,这可以假设有效:
bindConstant().annotatedWith(MyAnnotation.class).to("aStringValue");
bindConstant().annotatedWith(MyAnnotation.class).to(123);
顺便说一句,我很好奇为什么你不能在属性上使用@Named注释,但你可以在注入的bean上使用它们吗?