Spring,原型和MBeanExporter

时间:2012-10-05 14:08:51

标签: java spring jmx

我将Spring与其MBeanExporter结合使用。我有一个原型bean定义,只有在调用ApplicationContext.getBean()时才能实例化。但是,MBeanExporter在引导容器时(错误地)实例化原型bean的实例。

我从很久以前就找到了this bug report,没有明显的反应。

在我看来,这似乎是一种常见的情况,所以我觉得我必须遗漏一些东西。重要的是我的原型不能提前实例化,并且我可以使用MBeanExporter使我的JMX集成更简单。谁能解释我做错了什么?

作为参考,我的spring配置如下所示:

<bean id="foo" class="MyPrototypeClassName" scope="prototype"/>

<bean id="namingStrategy" class="org.springframework.jmx.export.naming.IdentityNamingStrategy"/>

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="namingStrategy" ref="namingStrategy"/>
    <property name="autodetect" value="true"/>
</bean>

2 个答案:

答案 0 :(得分:0)

我找到了一些解决方法,但它很笨重,所以我怀疑这不是最佳做法。我只是将导出器配置更改为:

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="namingStrategy" ref="namingStrategy"/>
    <property name="autodetect" value="true"/>
    <property name="excludedBeans">
        <list>
            <value>foo</value>
        </list>
    </property>
</bean>

这样自动导出器会忽略我的原型bean。因此,我的原型bean现在可以引用MBeanExporter(之前这导致了无法解析的依赖循环)。所以现在我的原型可以在JMX中注册并注销自己。

如果有人可以权衡这是一种好/坏方法,我会很感激。

答案 1 :(得分:0)

您可以使用MyJmxAutodetectExclude等自定义标记界面并扩展Spring MetadataMBeanInfoAssembler。这样,每次重构代码时都不需要调整context.xml

public class MyMBeanInfoAssembler extends MetadataMBeanInfoAssembler {

    @Override
    public boolean includeBean(final Class<?> beanClass, final String beanName) {
        if (super.includeBean(beanClass, beanName)) {
            List<Class<?>> list = Arrays.asList(beanClass.getInterfaces());
            if (list.contains(MyJmxAutodetectExclude.class)) {
                return false;
            }
            return true;
        }
        return false;
    }
}