20.4. 控制Bean的ObjectName

Spring Framework

20.4. 控制Bean的ObjectName

对于每个Bean的注册,MBeanExporter 在后台委派给了 ObjectNamingStrategy 的一个实现来获取 ObjectName。 缺省实现是 KeyNamingStrategy,它将默认使用 beansMap 的键值作为 ObjectName。 此外,KeyNamingStrategy 可以将该键值与 Properties 文件中的一个条目对应,以此解析 ObjectName。 除了 KeyNamingStrategy 之外,Spring还提供了另外两个 ObjectNamingStrategy 的实现: 基于bean的JVM标识构建 ObjectNameIdentityNamingStrategy; 利用源代码级元数据获取 ObjectNameMetadataNamingStrategy

20.4.1. 从Properties读取Properties

你可以配置你自己的 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的键值,因此 testBeanObjectName 将被指定为 bean:name=testBean1

假若没有任何条目可以从 Properties 实例找到,Bean的键值将会作为 ObjectName

20.4.2. 使用MetadataNamingStrategy

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>

假若没有 objectNameManagedResource里提供,那么一个 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"/>

20.4.3. <context:mbean-export/>元素

如果你至少在使用Java 5,那么就可以使用一个方便的 MBeanExporter 子类, AnnotationMBeanExporter。 当定义一个这个子类的实例时,由于他将始终使用基于注解的标准Java元数据(自动探测也将始终被激活),namingStrategyattributeSource 的配置也不再需要了。

<context:mbean-export/>

必要时,你可以提供某个MBean服务器的引用,同时 defaultDomain 属性 (AnnotationMBeanExporter的一个属性)接受产生的MBean ObjectNames域名的替代值。 这被用于替代前面章节 MetadataNamingStrategy 提及的完整限定包名。

<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
.