Попытка использовать Spring PropertyOverrideConfigurer или какой-либо подобный подкласс, чтобы помочь создать следующий bean-компонент:

public class Foo {
  private final String name;

  public Foo(String name) { this.name = name; }

  public String getName() { return name; }
}

Предположим, что мое определение bean-компонента что-то вроде

<bean id="foo" class="Foo">
  <constructor-arg name="name" value="abc">
</bean>

Я передал Spring файл foo.properties, там он находит запись foo.name="def"

Таким образом, свойство имени по умолчанию для компонента Foo — «abc», я хочу, чтобы оно было переопределено как «def»; ОДНАКО я не хочу, чтобы явный метод setName(String name) зависал от моего класса Foo, поскольку, несмотря на то, что Spring думает, я считаю это ужасной идеей в разработке программного обеспечения. Я ожидаю, что Spring сможет передать переопределенное значение как «def» конструктору Foo, а не вызывать Foo позже с помощью setName («def»).

Я не получил это, чтобы работать, есть способ? Единственный успех, который у меня был, это добавить метод

 public void setName(String name) { this.name = name; }

К классу Foo, что опять же я считаю ужасной идеей, поскольку она открывает ваш класс для непреднамеренных побочных эффектов позже.

Есть ли надежда? Могу ли я изменить определение компонента где-нибудь до того, как Spring создаст Foo с (неправильным) именем «abc»?

0
user1156327 30 Мар 2011 в 20:54
Здесь вы можете найти решение. Меня устраивает. Удачи.
 – 
user1149205
27 Янв 2012 в 17:09

1 ответ

Вы определенно можете это сделать. Ваш xml должен выглядеть примерно так:

<bean id="foo" class="Foo">
   <constructor-arg index="0" value="abc"/>
</bean>

Предполагая, что конструктор имеет один параметр, а «abc» — это значение, полученное из вашего файла свойств. В этом случае сеттер не нужен.

Дополнительная информация доступна в документации Spring по адресу http ://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-collaborators

0
Eugene Ryzhikov 30 Мар 2011 в 23:19
Извините, я опечатался в своем определении bean-компонента, я уже использовал аргумент-конструктор, а не свойство, исправлю свой пост.
 – 
user1156327
30 Мар 2011 в 23:39
Тогда ваш вопрос не имеет смысла. Если у вас определен аргумент конструктора - параметры передаются в конструктор при создании компонента.
 – 
Eugene Ryzhikov
30 Мар 2011 в 23:54
"abc" передается, а не "def". Позже появляется Spring и вызывает setName("def"), чего я не хотел. Я хочу, чтобы конструктор вызывался с помощью "def"
 – 
user1156327
11 Апр 2011 в 19:31