Java Spring、原型和MBeanExporter
我将Spring与其Java Spring、原型和MBeanExporter,java,spring,jmx,Java,Spring,Jmx,我将Spring与其MBeanExporter结合使用。我有一个原型bean定义,只有在调用ApplicationContext.getBean()时才应该实例化它。但是,MBeanExporter在引导容器时(错误地)实例化了原型bean的实例 我发现很久以前,没有明显的反应 在我看来,这一定是一种常见的情况,所以我觉得我一定错过了什么。重要的是不要提前实例化我的原型,我可以使用MBeanExporter简化JMX集成。谁能解释我做错了什么 作为参考,我的spring配置如下所示: <b
MBeanExporter
结合使用。我有一个原型bean定义,只有在调用ApplicationContext.getBean()
时才应该实例化它。但是,MBeanExporter
在引导容器时(错误地)实例化了原型bean的实例
我发现很久以前,没有明显的反应
在我看来,这一定是一种常见的情况,所以我觉得我一定错过了什么。重要的是不要提前实例化我的原型,我可以使用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>
我找到了一些解决方法,但它很笨重,所以我怀疑这不是最佳做法。我只是将我的导出器配置更改为:
<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中注册和注销自己
如果有人能权衡一下这是否是一种好的/坏的方法,我将不胜感激。您可以使用自定义标记接口,如
myjmxautodetectedclude
和扩展SpringMetadataMBeanInfoAssembler
。这样,您就不需要每次重构代码时都调整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;
}
}
公共类MyMBeanInfoAssembler扩展MetadataMBeanfoAssembler{
@凌驾
公共布尔includeBean(最终类beanClass,最终字符串beanName){
if(超级包含Bean(beanClass,beanName)){
列表