Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring、原型和MBeanExporter_Java_Spring_Jmx - Fatal编程技术网

Java Spring、原型和MBeanExporter

Java Spring、原型和MBeanExporter,java,spring,jmx,Java,Spring,Jmx,我将Spring与其MBeanExporter结合使用。我有一个原型bean定义,只有在调用ApplicationContext.getBean()时才应该实例化它。但是,MBeanExporter在引导容器时(错误地)实例化了原型bean的实例 我发现很久以前,没有明显的反应 在我看来,这一定是一种常见的情况,所以我觉得我一定错过了什么。重要的是不要提前实例化我的原型,我可以使用MBeanExporter简化JMX集成。谁能解释我做错了什么 作为参考,我的spring配置如下所示: <b

我将Spring与其
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
和扩展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;
    }
}
公共类MyMBeanInfoAssembler扩展MetadataMBeanfoAssembler{
@凌驾
公共布尔includeBean(最终类beanClass,最终字符串beanName){
if(超级包含Bean(beanClass,beanName)){
列表