在Spring 3.0中的依赖注入期间指定setter方法名称

时间:2011-07-16 17:17:23

标签: spring dependency-injection spring-3

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

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

有没有办法在注入属性时指定setter方法名?

3 个答案:

答案 0 :(得分:8)

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

此外,您可以使用Adapter pattern将对象包装成符合getXXX / setXXX约定的内容,并在包装​​器上以标准方式执行DI。

答案 1 :(得分:0)

不,我不知道。

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

我没有看到打破标准的优势,但我看到了很多不利因素。如果你打破了排名并调用方法“setUsername”会对你的设计造成什么伤害?

答案 2 :(得分:0)

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