Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Guice向bean注入简单的配置参数?_Java_Guice - Fatal编程技术网

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

Java 如何使用Guice向bean注入简单的配置参数?,java,guice,Java,Guice,有没有一种简单的方法将简单的原语类型参数(string和int)注入bean 我需要的是从spring.xml中找到类似这样的guice: <bean id="aBean" ...> <property name="fieldName" value="aStringValue"/> <property name="anotherFieldName" value="123"/> </bean> 这些值可以是构造函数注入的、字段注入的或

有没有一种简单的方法将简单的原语类型参数(string和int)注入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;
      }
...
}
MyModule扩展了AbstractModule{
...
@提供@Named(“testBean”)MyTestBean createTestBean(MembersInjector mi){
TestBean test=新的TestBean();
mi.成员(测试);
test.setFieldName(“aStringValue”);
test.setAnotherFieldName(123);
回归试验;
}
...
}
好的一点是,提供的方法替换了bean的bind(),这样实际的行数就不会增加很多


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

有一种内置机制来注入属性

属性文件:

name=jan
city=hamburg
模块

@Override
protected void configure() {
    Names.bindProperties(binder(), properties);
}
然后在bean中,只需按名称注入

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

有一种内置机制来注入属性

属性文件:

name=jan
city=hamburg
模块

@Override
protected void configure() {
    Names.bindProperties(binder(), properties);
}
然后在bean中,只需按名称注入

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

有几种不同的方法可以做到这一点,包括你的方法。使用提供者方法的唯一缺点是,它本质上是一个手工制作的工厂,您必须记住要维护它。(在本例中,您也没有获得构造函数注入的好处)

如果没有提供程序方法,则必须使用某种绑定注释。如果@Named不适合您,那么您需要为每个绑定创建一个注释

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

public SomeClass {
    public void setFieldName(@FieldName String fieldname) {}
}
在某些情况下,这可能需要绑定每个基元/字符串实例的1对1注释。但是我试图使我的注释与所描述的实际实例有点正交,而宁愿使用注释来描述绑定对象和注入点之间的关系

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

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

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

有几种不同的方法可以做到这一点,包括您自己的方法。使用提供者方法的唯一缺点是,它本质上是一个手工制作的工厂,您必须记住要维护它。(在本例中,您也没有获得构造函数注入的好处)

如果没有提供程序方法,则必须使用某种绑定注释。如果@Named不适合您,那么您需要为每个绑定创建一个注释

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

public SomeClass {
    public void setFieldName(@FieldName String fieldname) {}
}
在某些情况下,这可能需要绑定每个基元/字符串实例的1对1注释。但是我试图使我的注释与所描述的实际实例有点正交,而宁愿使用注释来描述绑定对象和注入点之间的关系

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

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

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

你试过谷歌吗?(例如)如果我必须使用xml,我宁愿不从spring迁移:)嗯,“类似于spring.xml中的类似内容”听起来对我来说显然是xml。也许如果你提到你不想要XML?但在这种情况下,还有什么?普利斯特?如何更好?好吧:)那么让我换一种方式问它-如何从guice模块将字符串传递给bean?这是一项简单的任务,我想知道最简单的解决方案是什么你试过谷歌吗?(例如)如果我必须使用xml,我宁愿不从spring迁移:)嗯,“类似于spring.xml中的类似内容”听起来对我来说显然是xml。也许如果你提到你不想要XML?但在这种情况下,还有什么?普利斯特?如何更好?好吧:)那么让我换一种方式问它-如何从guice模块将字符串传递给bean?这是一项简单的任务,我想知道最简单的解决方案是什么Hi,由于各种原因我不能使用命名属性,但我也不喜欢这种方法,因为它会用很多值污染注入器并产生名称冲突。Hi,由于各种原因我不能使用命名属性,但我也不喜欢这种方法,因为它会用很多值污染注入器,并产生名称冲突。