2011-03-18 87 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