对于每个Bean的注册,MBeanExporter
在后台委派给了 ObjectNamingStrategy
的一个实现来获取 ObjectName
。
缺省实现是 KeyNamingStrategy
,它将默认使用 beans
上 Map
的键值作为 ObjectName
。
此外,KeyNamingStrategy
可以将该键值与 Properties
文件中的一个条目对应,以此解析 ObjectName
。
除了 KeyNamingStrategy
之外,Spring还提供了另外两个 ObjectNamingStrategy
的实现:
基于bean的JVM标识构建 ObjectName
的 IdentityNamingStrategy
;
利用源代码级元数据获取 ObjectName
的 MetadataNamingStrategy
。
你可以配置你自己的 KeyNamingStrategy
实例,配置它从一个 Properties
实例读取 ObjectName
,而不是用Bean的键值。
KeyNamingStrategy
首先会用bean的键值试图从 Properties
中定位一个条目。
假若没有找不到对应的条目,或者 Properties
实例为 null
,最后才使用Bean的键值作为 ObjectName
。
以下代码显示了关于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>
这个 KeyNamingStrategy
实例配置了一个 Properties
实例,而这个 Properties
实例由mapping属性和mappingLocations属性所指定的路径定位到的 Properties
文件合成。
在这个配置里,由于 Properties
实例有个键值对应该Bean的键值,因此 testBean
的 ObjectName
将被指定为 bean:name=testBean1
。
假若没有任何条目可以从 Properties
实例找到,Bean的键值将会作为 ObjectName
。
MetadataNamingStrategy
用每个Bean上 ManagedResource
属性的 objectName
属性来构建 objectName
。
以下代码展示了对于 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>
假若没有 objectName
在 ManagedResource
里提供,那么一个 ObjectName
将以以下格式创建:
[fully-qualified-package-name]:type=[short-classname],name=[bean-name]。
例如,对于以下的Bean,产生的 ObjectName
将是 com.foo:type=MyClass,name=myBean。
<bean id="myBean" class="com.foo.MyClass"/>
如果你至少在使用Java 5,那么就可以使用一个方便的 MBeanExporter
子类, AnnotationMBeanExporter
。
当定义一个这个子类的实例时,由于他将始终使用基于注解的标准Java元数据(自动探测也将始终被激活),namingStrategy
和 attributeSource
的配置也不再需要了。
<context:mbean-export/>
必要时,你可以提供某个MBean服务器的引用,同时 defaultDomain
属性
(AnnotationMBeanExporter
的一个属性)接受产生的MBean
ObjectNames
域名的替代值。
这被用于替代前面章节 MetadataNamingStrategy
提及的完整限定包名。
<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>.