0

Spring をその と組み合わせて使用​​していMBeanExporterます。への呼び出しが行われたときにのみインスタンス化する必要があるプロトタイプ Bean 定義がありますApplicationContext.getBean()。ただし、MBeanExporterコンテナーをブートストラップするときに、(誤って) プロトタイプ Bean のインスタンスをインスタンス化しています。

何年も前からこのバグレポートを見つけましたが、注目に値する応答はありませんでした。

これはよくあるシナリオのように思えるので、何かが欠けているように感じます。プロトタイプを前もってインスタンス化しないことが重要でありMBeanExporter、JMX 統合を簡素化するために使用できます。誰かが私が間違っていることを説明できますか?

参考までに、私の春の設定は次のようになります。

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

2 に答える 2

0

MyJmxAutodetectExcludeSpringのようなカスタム マーカー インターフェイスを使用して拡張できます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;
    }
}
于 2014-07-03T06:00:02.590 に答える
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 に登録および登録解除できるようになりました。

これが良い/悪いアプローチであるかどうかについて誰かが検討できるなら、私はそれを感謝します.

于 2012-10-05T14:24:38.037 に答える