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

use*_*964 5 spring dependency-injection spring-3

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

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

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

小智 8

可以使用MethodInvokingFactoryBean类来执行此操作.通过这个,您可以在目标对象上调用方法.

使用Spring实例化对象,然后调用addUserName它.

我不确定你是否可以用注释来做到这一点,但是你可以使用XML.例如:

package some.pack;

public class Target {
  private String userName;
  public Target() {
    ...
  }
  public void addUserName(String userName) {
    this.userName = userName;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下内容userNameTarget实例上设置属性:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是,如果需要调用多个方法,则必须为每个方法添加一个"调用者"bean.这将增加您必须编写的XML的大小.

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


duf*_*ymo 0

不,据我所知,没有办法。

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

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