在后台,MBeanExporter 委派 ObjectNamingStrategy 的一个实现去获取正在注册的每个bean的ObjectName。
缺省的实现是 KeyNamingStrategy,它缺省用 beans Map 的键作为 ObjectName。
此外,KeyNamingStrategy 能把beans Map 的键映射为一个 Properties 文件中的实体,以此来决定 ObjectName。
除了 KeyNamingStrategy 之外,Spring提供了另外两个 ObjectNamingStrategy 的实现:
IdentityNamingStrategy 构造一个 ObjectName,
这是基于JVM识别的bean;MetadataNamingStrategy 是用源代码级元数据获取 ObjectName。
可以配置你自己 KeyNamingStrategy 实例,配置它从一个 Properties 的实例中读取 ObjectName,而不是用bean的键去读。
KeyNamingStrategy 会试着用与bean键相应的键在 Properties 中查找一个实体。
如果没有发现任何实体或是 Properties 实例为 null,就用这个bean的键。
下面代码展示了一个 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>
用一个 Properties 的实例来配置一个 KeyNamingStrategy 的实例,
这个 Properties 的实例是由映射属性定义的 Properties 实例和由映射属性定义的路径中的属性文件的内容合并起来的。
这个配置中,给bean testBean 的 ObjectName 值为 bean:name=testBean1 ,
因为这个实体在 Properties 的实例中,这个实例有一个与bean的键相对应的键。
如果在 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>