Как ввести простые параметры конфигурации в bean-компоненты с помощью Guice? - PullRequest
1 голос
/ 22 марта 2012

Существует ли простой способ для добавления простых параметров примитивного типа (string и int) в bean-компоненты?

Что мне нужно, чтобы найти приблизительный эквивалент чего-то подобного из весны.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;
      }
...
}

Хорошим моментом является то, что метод Provides заменяет bind () для bean-компонента, и таким образом фактическое количество строк не сильно увеличивается.

Я все еще не на 100%уверен в любых побочных эффектах, но выглядит многообещающе.

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Существует встроенный механизм для ввода свойств.

Файл свойств:

name=jan
city=hamburg

Модуль

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

тогда в свой бин, просто введите по имени

class Customer {
  @Inject
  @Named("name")
  String name;
  ....
}
0 голосов
/ 01 апреля 2012

Есть несколько способов сделать это, в том числе и ваш. Единственный недостаток использования метода Provider заключается в том, что это по сути фабрика, созданная вручную, которую вы должны помнить для поддержки. (И в этом конкретном случае вы также не получаете преимуществ от внедрения конструктора).

При отсутствии метода Provider, вы должны использовать аннотацию привязки какого-либо вида. Если @Named не будет работать для вас, вам нужно будет создать аннотацию для каждой привязки.

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

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

В некоторых случаях для этого может потребоваться привязка аннотации 1 к 1 для каждого примитива / экземпляра String. Но я пытаюсь сделать свои аннотации несколько ортогональными к описываемому фактическому экземпляру, предпочитая вместо этого использовать аннотацию для описания взаимосвязи между связанными объектами и точками внедрения.

Это не всегда возможно, но целая группа связанных примитивов может потенциально быть описана одной аннотацией привязки, если каждый тип примитива используется только один раз в наборе. Итак, это может гипотетически сработать:

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

В скобках, мне любопытно, почему вы не можете использовать аннотации @Named для свойства, но вы можете использовать их для введенного компонента?

...