20.4. 控制bean的 ObjectName

在后台,MBeanExporter 委派 ObjectNamingStrategy 的一个实现去获取正在注册的每个bean的ObjectName。 缺省的实现是 KeyNamingStrategy,它缺省用 beans Map 的键作为 ObjectName。 此外,KeyNamingStrategy 能把beans Map 的键映射为一个 Properties 文件中的实体,以此来决定 ObjectName。 除了 KeyNamingStrategy 之外,Spring提供了另外两个 ObjectNamingStrategy 的实现: IdentityNamingStrategy 构造一个 ObjectName, 这是基于JVM识别的bean;MetadataNamingStrategy 是用源代码级元数据获取 ObjectName

20.4.1. 从Properties中读取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 testBeanObjectName 值为 bean:name=testBean1 , 因为这个实体在 Properties 的实例中,这个实例有一个与bean的键相对应的键。

如果在 Properties 实例中没有找到实体,则bean的键名将用作 ObjectName 的值。

20.4.2. 使用 MetadataNamingStrategy

MetadataNamingStrategy 使用每个bean属性 ManagedResourceObjectName 属性来创建 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>