我正在准备一种豆子,它存在于我正在使用的一个罐子中。
该类具有不符合 Spring 框架期望执行注入的标准 setter 方法名称的 setter 方法(例如,该属性userName
具有 setter 方法addUserName
而不是setUserName
)。
有没有办法在注入属性期间指定设置方法名称?
我正在准备一种豆子,它存在于我正在使用的一个罐子中。
该类具有不符合 Spring 框架期望执行注入的标准 setter 方法名称的 setter 方法(例如,该属性userName
具有 setter 方法addUserName
而不是setUserName
)。
有没有办法在注入属性期间指定设置方法名称?
可以使用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。
如果您无法更改要实例化的类的代码,请尝试使用静态或实例工厂方法,其中工厂是您的代码,可以将用户名作为参数并调用 obj.addUsername(name)。
不,我不知道有什么办法。
您可以使用注释自动装配。您可以使用构造函数注入。
我看不出打破标准有多少好处,但我看到了很多坏处。如果您打破等级并将方法称为“setUsername”,会对您的设计造成什么损害?