public class MetaAttributeMBeanExporter extendsMBeanExporter
{protectedListableBeanFactory theBeanFactory;public static final String JMX_NAME = "jmxName";protected boolean initialized = false;
@Overridepublic voidsetBeanFactory(BeanFactory beanFactory) {if (beanFactory instanceofListableBeanFactory) {this.theBeanFactory =(ListableBeanFactory) beanFactory;
}else{
logger.info("MBeanExporter not running in a ListableBeanFactory: Autodetection of MBeans not available.");
}super.setBeanFactory(beanFactory);
}
@Overridepublic voidafterPropertiesSet()
{
Map beanMap = new HashMap();if (this.server == null) {this.server =JmxUtils.locateMBeanServer();
}
String[] beanNames= this.theBeanFactory.getBeanNamesForType(Object.class, true, false);for (int i = 0; i < beanNames.length; i++) {
String beanName=beanNames[i];
String beanJMXName=getBeanJMXNameIfAny(theBeanFactory, beanName);if ( beanJMXName != null) {boolean isAlreadyRegistered = false;try{
isAlreadyRegistered=server.isRegistered(getObjectName(beanName, beanJMXName));
}catch(MalformedObjectNameException e) {
logger.warn("The bean JMX Name [" + beanJMXName + "] is malformed. Skipping...");continue;
}if ( !isAlreadyRegistered )
{//Not already registered for JMX exposure.
beanMap.put(beanJMXName, beanName);if(logger.isDebugEnabled()) {
logger.debug("Bean with name '" + beanName + "' has been autodetected for JMX exposure");
}
}
}
}//finally
super.setBeans(beanMap);super.afterPropertiesSet();
}protectedString getBeanJMXNameIfAny(ListableBeanFactory beanFactory, String beanName)
{if (!(beanFactory instanceofConfigurableListableBeanFactory)) {return null;
}try{
BeanDefinition bd=((ConfigurableListableBeanFactory) beanFactory).getBeanDefinition(beanName);
BeanMetadataAttributeAccessor def=(BeanMetadataAttributeAccessor) bd;
BeanMetadataAttribute meta=def.getMetadataAttribute(JMX_NAME);if ( meta == null)
{return null;
}else{return(String)meta.getValue();
}
}catch(NoSuchBeanDefinitionException ex) {//Probably a directly registered singleton.
return null;
}
}
}