Укажите имя метода установки во время внедрения зависимостей в Spring 3.0 - PullRequest
5 голосов
/ 16 июля 2011

Я готовлю боб, который присутствует в одной из банок, которые я использую.

В классе есть методы установки, которые не соответствуют стандартному имени метода установки, ожидаемого средой Spring для выполнения внедрения (например, свойство userName имеет метод установки addUserName вместо setUserName).

Есть ли способ указать имя метода установки во время ввода свойств?

Ответы [ 3 ]

8 голосов
/ 17 июля 2011

Это можно сделать с помощью класса MethodInvokingFactoryBean .При этом вы можете вызвать метод для целевого объекта.

Вы создаете экземпляр своего объекта с помощью Spring, а затем вызываете addUserName для него.

Я не уверен, что вы можете сделать это с аннотациями, но с XML вы можете.Например:

package some.pack;

public class Target {
  private String userName;
  public Target() {
    ...
  }
  public void addUserName(String userName) {
    this.userName = userName;
  }
  ...
}

Вы можете установить свойство userName для экземпляра Target примерно так:

<!-- first create your Target object -->
<bean id="target" class="some.pack.Target" />

<!-- then set the userName property by calling the non-conventional setter -->
<bean id="caller" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="targetObject" ref="target" />
  <property name="targetMethod" value="addUserName" />
  <property name="arguments">
    <list>
      <value>John_Doe</value>
    </list>
  </property>
</bean>

Недостатком этого является то, что если вам нужновызовите несколько методов, вам нужно будет добавить bean-компонент для каждого метода.Это увеличит размер XML, который вам нужно написать.

Кроме того, вы можете использовать шаблон адаптера , чтобы обернуть ваш объект во что-то, соответствующее правилам getXXX / setXXXвместо этого сделайте DI стандартным способом на обертке.

0 голосов
/ 16 июля 2011

Если вы не можете изменить код класса, который хотите создать, попробуйте использовать статический или фабричный метод экземпляра, где factory - это ваш код, который может принимать имя пользователя в качестве параметра и вызывать obj.addUsername (name).

0 голосов
/ 16 июля 2011

Нет, я никак не могу об этом знать.

Вы можете автоматически подключиться с помощью аннотации.Вы можете использовать конструктор инъекций.

Я не вижу большого преимущества в нарушении стандарта, но я вижу много недостатков.Что могло бы повредить вашему дизайну, если бы вы разбили ряды и назвали метод "setUsername"?

...