在后台,委托给一个实现,以获取它注册的每个 Bean 的实例。 默认情况下,默认实现使用 的键作为 .此外,可以映射密钥 的 到 文件(或多个文件)中的条目,以解析 .除了 之外,Spring 还提供了两个额外的实现:(它基于 Bean 的 JVM 身份构建一个)和 ( 使用源级元数据获取 )。MBeanExporterObjectNamingStrategyObjectNameKeyNamingStrategybeansMapObjectNameKeyNamingStrategybeansMapPropertiesObjectNameKeyNamingStrategyObjectNamingStrategyIdentityNamingStrategyObjectNameMetadataNamingStrategyObjectName

从属性中读取实例ObjectName

您可以配置自己的实例,并将其配置为从实例中读取实例,而不是使用 Bean 密钥。尝试在 with a key 中查找条目 这对应于 Bean 键。如果未找到条目或实例为 ,则使用 Bean 键本身。KeyNamingStrategyObjectNamePropertiesKeyNamingStrategyPropertiesPropertiesnull

以下代码显示了以下代码的示例配置: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>

前面的示例配置一个实例,其中的实例 从 mapping 属性定义的实例合并而来,并且 属性文件,位于 Mappings 属性定义的路径中。在这个 配置中,bean 被赋予 的 , 因为这是实例中的条目,其键对应于 Bean 密钥。KeyNamingStrategyPropertiesPropertiestestBeanObjectNamebean:name=testBean1Properties

如果在实例中找不到任何条目,则 Bean 键名称用作 这。PropertiesObjectName

MetadataNamingStrategy

MetadataNamingStrategy使用每个 Bean 上的属性来创建 .以下代码显示了 的配置:objectNameManagedResourceObjectNameMetadataNamingStrategy

<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.annotation.AnnotationJmxAttributeSource"/>

</beans>

如果未为该属性提供任何信息,则使用以下内容创建一个 format: [fully-qualified-package-name]:type=[short-classname],name=[bean-name]。为 例如,为以下 Bean 生成的 Bean 为:objectNameManagedResourceObjectNameObjectNamecom.example:type=MyClass,name=myBean

<bean id="myBean" class="com.example.MyClass"/>

配置基于注释的 MBean 导出

如果您更喜欢使用基于注释的方法来定义 您的管理界面,一个方便的子类可用:。定义此子类的实例时,不再需要 、 和 配置, 因为它始终使用基于 Java 注释的标准元数据(自动检测是 也始终启用)。事实上,与其定义豆子,不如定义偶数 注释支持更简单的语法, 如以下示例所示:MBeanExporterAnnotationMBeanExporternamingStrategyassemblerattributeSourceMBeanExporter@EnableMBeanExport@Configuration

@Configuration
@EnableMBeanExport
public class AppConfig {

}

如果您更喜欢基于 XML 的配置,则该元素提供 相同的目的,并在以下列表中显示:<context:mbean-export/>

<context:mbean-export/>

如有必要,可以提供对特定 MBean 的引用,并且属性(属性 )接受替代 生成的 MBean 域的值。这用于代替 完全限定的包名称,如上一节 MetadataNamingStrategy 中所述,如以下示例所示:serverdefaultDomainAnnotationMBeanExporterObjectName

@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
@Configuration
ContextConfiguration {

}

下面的示例显示了前面基于批注的示例的 XML 等效项:

<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
不要将基于接口的 AOP 代理与 JMX 的自动检测结合使用 Bean 类中的注解。基于接口的代理“隐藏”目标类,这 还隐藏了 JMX 管理的资源注释。因此,您应该使用目标类代理 case(通过将“proxy-target-class”标志设置为 ,依此类推)。否则,您的 JMX Bean 可能会在 启动。<aop:config/><tx:annotation-driven/>