我将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>
答案 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;
}
}