【问题标题】:Howto inject simple config parameters to beans using Guice?如何使用 Guice 向 bean 注入简单的配置参数?
【发布时间】:2012-03-22 12:15:58
【问题描述】:

是否有一种简单的方法可以将简单的原始类型参数(字符串和整数)注入到 bean 中?

我需要的是从 spring.xml 中找到类似这样的 guice:

<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;
      }
...
}

好处是,Provides 方法替换了 bean 的 bind(),这样实际行数不会增加太多。

我仍然不能 100% 确定任何副作用,但它看起来很有希望。

【问题讨论】:

  • 你试过谷歌吗? (例如code.google.com/p/guice-xml-config
  • 如果我必须使用 xml 我宁愿不从 spring 迁移:)
  • 嗯,“来自 spring.xml 的类似内容”听起来对我来说显然是 XML。也许如果您提到您不想要 XML?但在这种情况下还有什么?列表?好点了吗?
  • 好吧 :) 让我换个方式问 - 你如何将字符串从 guice 模块传递给 bean?这是一项简单的任务,我想知道最简单的解决方案是什么

标签: java guice


【解决方案1】:

有一个内置机制来注入属性。

属性文件:

name=jan
city=hamburg

模块

@Override
protected void configure() {
    Names.bindProperties(binder(), properties);
}

然后在您的 bean 中,只需按名称注入

class Customer {
  @Inject
  @Named("name")
  String name;
  ....
}

【讨论】:

  • 嗨,由于各种原因,我不能使用命名属性,但我也不喜欢这种方法,因为它会用大量值污染注入器并产生名称冲突。
【解决方案2】:

您可以通过多种不同的方式执行此操作,包括您自己的方式。使用 Provider 方法的唯一缺点是它本质上是一个您必须记住维护的手动工厂。 (在这种特定情况下,您也没有获得构造函数注入的好处)。

没有提供者方法,你必须使用某种绑定注解。如果 @Named 对您不起作用,那么您需要为每个绑定创建一个注释。

bindConstant().annotatedWith(FieldName.class).to("aStringValue");

public SomeClass {
    public void setFieldName(@FieldName String fieldname) {}
}

在某些情况下,这可能需要绑定每个基元/字符串实例的一对一注释。但我尝试让我的注释与所描述的实际实例有些正交,而是更喜欢使用注释来描述绑定对象和注入点之间的关系。

这并不总是可能的,但是一组相关的原语可能会被一个绑定注释描述,只要每个原语类型在集合中只使用一次。所以,这可能会起作用:

 bindConstant().annotatedWith(MyAnnotation.class).to("aStringValue");
 bindConstant().annotatedWith(MyAnnotation.class).to(123);

顺便说一句,我很好奇为什么您不能在属性上使用@Named 注释,但您可以在注入的 bean 上使用它们?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多