2011-03-18 13 views
17

Me gustaría crear el siguiente bean de Spring (un monitor JMX) que tiene un método setThresholds (Number highThreshold, Number lowThreshold).Inicialización de bean de resorte con método de arc múltiple

¿Pude invocar el método (con dos argumentos) en la configuración? No quiero escribir códigos para invocarlo.

<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

"No quiero escribir códigos para alegar ésta". Por qué no? ¿Por qué quieres hacer cosas raras en XML, en lugar de hacerlo Java, donde pertenece? – skaffman

+0

@skaffman - Por razones de mantenimiento ... Por lo general, me gusta mantener este tipo de detalles de configuración en XML. –

+0

Pregunta similar: http://stackoverflow.com/questions/5312605/spring-configuring-bean-with-a-two-argument-setter/5312634#5312634 –

Respuesta

30

es posible mediante el uso de la MethodInvokingFactoryBean (primavera y 4.x5.x) (no es mi idea, acabo de encontrar i T este foro: 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

El bean de fábrica tiene que estar fuera del "algúnObjeto" – byeo

+0

@byeo: Sí, eso es correcto. En el ejemplo anterior, ya estaba afuera (hay un '/' al final de la definición de bean 'someobject'), pero la sangría era confusa. - He mejorado el formato ahora. – Ralph

+0

Si desea utilizar esto para fines de configuración, me parece bastante hinchado. Si tiene veinte parámetros para la aplicación, definirá 40 beans, 20 beans reales y 20 beans de fábrica (no tan fáciles de leer, imho). Lo que quiero decir es que el archivo de configuración está hinchado. Aún así, probé una solución JAVA y eso también parecía bastante hinchado ... :) – Timo

1

Nunca he visto esto hecho. La gran idea de Spring es crear e inicializar beans directos. Por lo tanto, los únicos métodos que serán llamados son, por lo tanto, Setters de un solo argumento (...) y Constructores. La definición de lo que está apoyado estará en el siguiente esquema:

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

Su forma de evitar este problema es conseguir que su frijol para implementar InitializingBean y llame a su método en la void afterPropertiesSet() método:

por ejemplo:

public void setHighThreadHold(Number highThreshHold) {} 

public void setLowThreashHold(Number lowThreadHold) {} 


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

Como es una clase J2SE, no quiero agregar una clase de contenedor solo para invocar el método ... –

Cuestiones relacionadas