Behind the scenes, the MBeanExporter
delegates to an implementation of the
ObjectNamingStrategy to obtain
ObjectNames for each of the beans it is
registering. The default implementation,
KeyNamingStrategy, will, by default, use the key of
the beans Map as the
ObjectName. In addition, the
KeyNamingStrategy can map the key of the
beans Map to an entry in a
Properties file (or files) to resolve the
ObjectName. In addition to the
KeyNamingStrategy, Spring provides two additional
ObjectNamingStrategy implementations: the
IdentityNamingStrategy that builds an
ObjectName based on the JVM identity of the bean
and the MetadataNamingStrategy that uses source
level metadata to obtain the ObjectName.
You can configure your own
KeyNamingStrategy instance and configure it to
read ObjectNames from a
Properties instance rather than use bean key. The
KeyNamingStrategy will attempt to locate an entry
in the Properties with a key corresponding to the
bean key. If no entry is found or if the
Properties instance is null
then the bean key itself is used.
The code below shows a sample configuration for the
KeyNamingStrategy:
<beans> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="testBean" value-ref="testBean"/> </map> </property> <property name="namingStrategy" ref="namingStrategy"/> </bean> <bean id="testBean" class="org.springframework.jmx.JmxTestBean"> <property name="name" value="TEST"/> <property name="age" value="100"/> </bean> <bean id="namingStrategy" class="org.springframework.jmx.export.naming.KeyNamingStrategy"> <property name="mappings"> <props> <prop key="testBean">bean:name=testBean1</prop> </props> </property> <property name="mappingLocations"> <value>names1.properties,names2.properties</value> </property> </bean </beans>
Here an instance of KeyNamingStrategy is
configured with a Properties instance that is
merged from the Properties instance defined by
the mapping property and the properties files located in the paths
defined by the mappings property. In this configuration, the
testBean bean will be given the
ObjectName bean:name=testBean1
since this is the entry in the Properties
instance that has a key corresponding to the bean key.
If no entry in the Properties instance can
be found then the bean key name is used as the
ObjectName.
The MetadataNamingStrategy uses
the objectName property of the
ManagedResource attribute on each bean to create
the ObjectName. The code below shows the
configuration for the
MetadataNamingStrategy:
<beans> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="testBean" value-ref="testBean"/> </map> </property> <property name="namingStrategy" ref="namingStrategy"/> </bean> <bean id="testBean" class="org.springframework.jmx.JmxTestBean"> <property name="name" value="TEST"/> <property name="age" value="100"/> </bean> <bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> <property name="attributeSource" ref="attributeSource"/> </bean> <bean id="attributeSource" class="org.springframework.jmx.export.metadata.AttributesJmxAttributeSource"/> </beans>
If no objectName has been provided for
the ManagedResource attribute, then an
ObjectName will be created with the
following format:
[fully-qualified-package-name]:type=[short-classname],name=[bean-name].
For example, the generated ObjectName for the
following bean would be: com.foo:type=MyClass,name=myBean.
<bean id="myBean" class="com.foo.MyClass"/>
If you are using at least Java 5, then a convenience subclass of
MBeanExporter is available:
AnnotationMBeanExporter.
When defining an instance of this subclass, the namingStrategy,
assembler, and attributeSource
configuration is no longer needed, since it will always use standard Java
annotation-based metadata (autodetection is always enabled as well). In fact,
an even simpler syntax is supported with the inclusion of Spring's
'context' namespace in Spring 2.5. Rather than defining an
MBeanExporter bean, provide this single element:
<context:mbean-export/>You can provide a reference to a particular MBean server if
necessary, and the defaultDomain attribute
(a property of AnnotationMBeanExporter)
accepts an alternate value for the generated MBean
ObjectNames' domains. This would be used
in place of the fully qualified package name as described in the
previous section on
MetadataNamingStrategy.
<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>.
![]() | Note |
|---|---|
Do not use interface-based AOP proxies in combination with autodetection of
JMX annotations in your bean classes. Interface-based proxies 'hide' the target class,
which also hides the JMX managed resource annotations. Hence, use target-class proxies
in that case: through setting the 'proxy-target-class' flag on |