5

我正在准备一种豆子,它存在于我正在使用的一个罐子中。

该类具有不符合 Spring 框架期望执行注入的标准 setter 方法名称的 setter 方法(例如,该属性userName具有 setter 方法addUserName而不是setUserName)。

有没有办法在注入属性期间指定设置方法名称?

4

3 回答 3

9

可以使用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。

于 2011-07-16T20:09:05.547 回答
0

如果您无法更改要实例化的类的代码,请尝试使用静态或实例工厂方法,其中工厂是您的代码,可以将用户名作为参数并调用 obj.addUsername(name)。

于 2011-07-16T17:37:16.210 回答
0

不,我不知道有什么办法。

您可以使用注释自动装配。您可以使用构造函数注入。

我看不出打破标准有多少好处,但我看到了很多坏处。如果您打破等级并将方法称为“setUsername”,会对您的设计造成什么损害?

于 2011-07-16T17:29:41.567 回答