如何使用Guice向bean注入简单的配置参数?

时间:2012-03-22 12:15:58

标签: java guice

是否有简单的方法将简单的原始类型参数(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%确定任何副作用,但看起来很有希望。

2 个答案:

答案 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上使用它们吗?