使用多参数方法进行Spring bean初始化

19

我想创建一个Spring bean(一个JMX监视器),它有一个方法setThresholds(Number highThreshold, Number lowThreshold)

我能在配置中调用这个具有两个参数的方法吗?我不想编写代码来调用它。

<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>

“我不想编写代码来调用它。” 为什么不呢?为什么要在 XML 中做奇怪的事情,而不是在 Java 中完成它,因为它属于 Java 呢? - skaffman
@skaffman - 由于维护的原因...我通常喜欢将这种配置细节保存在XML中。 - Tommy Siu
类似问题:https://dev59.com/gVXTa4cB1Zd3GeqPzjyk#5312634 - Sean Patrick Floyd
2个回答

33

使用MethodInvokingFactoryBean(Spring 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>

工厂bean必须在“someObject”之外。 - byeo
@byeo:是的,没错。在上面的例子中,它已经在外面了(someobject bean定义结尾有一个“/”),但缩进混乱了。-- 我现在改进了格式。 - Ralph
如果你想将其用于配置目的,对我来说它似乎相当臃肿。如果你有20个参数要应用程序,你将定义40个bean,20个实际bean和20个(在我看来不太容易阅读的)工厂bean。我的意思是配置文件很臃肿。尽管如此,我尝试了一个JAVA解决方案,但那也似乎相当臃肿... :) - Timo
@Timo:如果你有更好/其他的解决方案,那么请发表你自己的答案。但如果你只是想抱怨Spring,请使用一些博客而不是滥用评论功能。 - Ralph
1
@Ralph,我没有更好的解决方案,否则我会发布它的。我希望引起你(或任何人)注意我的评论,并找到一个“更好”的解决方案,而我自己并没有立即看到它。我理解Spring在这个问题上的哲学,我并不是只是抱怨。没有冒犯之意! - Timo

1

我从未见过这样的做法。 Spring 的大想法是创建和初始化直截了当的 bean。因此,只会调用单参数 Setters(...) 和 Constructors 方法。支持什么定义将在以下模式中:

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类,我不想添加一个包装类来调用该方法... - Tommy Siu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接