2012-10-05 28 views
0

我使用Spring和MBeanExporter。我有一個原型bean定義,只有在調用ApplicationContext.getBean()時才應該實例化。但是,MBeanExporter(不正確)在引導容器時實例化原型bean的實例。Spring,原型和MBeanExporter

我發現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

我找到一個解決辦法的事情,但它是笨重,所以我懷疑這是不是最好的做法。我只是簡單地將我的導出器配置更改爲:

<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中註冊和取消註冊。

如果任何人都可以衡量這是一種好還是壞的方法,我會很感激。

0

您可以使用自定義標記界面,如MyJmxAutodetectExclude並擴展彈簧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; 
    } 
}