我正在准备一个豆子,它存在于我正在使用的其中一个罐子里。
该类具有setter方法,这些方法不符合Spring框架期望执行注入的标准setter方法名称(例如,属性userName
具有setter方法addUserName
而不是setUserName
)
有没有办法在注入属性时指定setter方法名?
答案 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)。