2011-03-18 90 views
17

我想创建以下Spring bean(JMX监视器),它具有方法setThresholds(Number highThreshold,Number lowThreshold)使用多重arg方法的Spring bean初始化

我可以在配置中调用方法(带有两个参数)吗?我不想编写代码来调用它。

<bean id="myMonitor" class="javax.management.monitor.GaugeMonitor" init-method="start"> 
    <property name="observedObject"> 
    <bean class="javax.management.ObjectName"> 
     <constructor-arg value="test.jmx:name=testBean1" /> 
    </bean> 
    </property> 
    <property name="observedAttribute" value="testProperty" /> 
    <property name="granularityPeriod"> 
    <bean class="java.lang.Float"> 
     <constructor-arg value="1000" /> 
    </bean> 
    </property> 
</bean> 
+0

“我不想写代码来调用它。”为什么不?为什么你想在XML中做奇怪的事情,而不是在Java中做它属于的地方? – skaffman 2011-03-18 08:41:01

+0

@skaffman - 出于维护的原因...我通常喜欢用XML保存这种配置细节。 – 2011-03-18 09:18:51

+0

类似的问题:http://stackoverflow.com/questions/5312605/spring-configuring-bean-with-a-two-argument-setter/5312634#5312634 – 2011-03-18 10:24:42

回答

30

有可能通过使用MethodInvokingFactoryBean(春季4.x5.x)(这是不是我的主意,我才发现我牛逼这个论坛:http://forum.springsource.org/archive/index.php/t-16354.html

SomeClass someobject = new SomeClass(); 
someobject.set("String1","String2"); 

<bean id="someobject" class="SomeClass" /> 

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="someobject"> 
    <property name="targetMethod" value="set"> 
    <property name="arguments"> 
     <list> 
      <value>String1</value> 
      <value>String2</value> 
     </list> 
    </property> 
</bean> 
+0

工厂bean必须在“someObject”之外 – byeo 2012-06-14 18:18:01

+0

@byeo:是的,那是对的。在上面的例子中,它已经在外面了(在'someobject'的bean定义的末尾有一个'/'),但是缩进是令人困惑的。 - 我现在改进了格式。 – Ralph 2012-06-15 06:34:13

+0

如果您想将其用于配置目的,它似乎非常臃肿。如果你有20个参数给应用程序,你将定义40个bean,20个实际bean和20个工厂bean(不太容易阅读,恕我直言)。我的意思是配置文件臃肿。尽管如此,我尝试了一个JAVA解决方案,而且这个解决方案看起来也很臃肿... :) – Timo 2013-09-06 10:03:27

1

我从来没有见过这样做。 Spring的主要思想是创建并初始化直接前进的bean。因此,将被调用的唯一方法是单参数Setters(...)和构造函数。一个什么样的支持的定义将在下面的模式:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

你解决这个问题的办法是让你的bean实现InitializingBean并调用你的方法在void afterPropertiesSet()方法:

例如:

public void setHighThreadHold(Number highThreshHold) {} 

public void setLowThreashHold(Number lowThreadHold) {} 


public void afterPropertiesSet() { 
    setThresholds(highThreshold,lowThreshold); 
} 
+1

因为它是一个J2SE类,我不想添加一个包装类,只是为了调用方法... – 2011-03-18 08:42:04