在幕后,委托给 的实现 以获取它注册的每个 bean 的实例。
默认情况下,默认实现使用 的键作为 .此外,还可以映射 key
的 添加到文件(或文件)中的条目中,以解析 .除了 之外,Spring 还提供了两个额外的实现:(基于 Bean 的 JVM 标识构建一个)和(它
使用源级元数据来获取 )。MBeanExporterObjectNamingStrategyObjectNameKeyNamingStrategybeansMapObjectNameKeyNamingStrategybeansMapPropertiesObjectNameKeyNamingStrategyObjectNamingStrategyIdentityNamingStrategyObjectNameMetadataNamingStrategyObjectName
从属性中读取实例ObjectName
您可以配置自己的实例,并将其配置为从实例读取实例,而不是使用 Bean 密钥。尝试在带有键的
对应于 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>
前面的示例将 的实例配置为 的实例,该实例
从映射属性定义的实例合并,并且
properties 文件位于 mappings 属性定义的路径中。在这个
configuration 时,bean 被赋予一个 of ,
由于这是实例中具有对应于
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>
如果尚未为属性提供 no,则使用以下命令创建一个
格式:[fully-qualified-package-name]:type=[short-classname],name=[bean-name]。为
例如,为以下 bean 生成的将是:objectNameManagedResourceObjectNameObjectNamecom.example:type=MyClass,name=myBean
<bean id="myBean" class="com.example.MyClass"/>
配置基于注释的 MBean 导出
如果您更喜欢使用基于注释的方法来定义
您的 Management 接口中,可以使用方便的子类:。定义此子类的实例时,您不再需要 、 和 配置
由于它始终使用基于 Java 注释的标准元数据(autodetection 为
也始终启用)。事实上,与其定义 bean,不如定义偶数
注解支持 simpler 语法,
如下例所示:MBeanExporterAnnotationMBeanExporternamingStrategyassemblerattributeSourceMBeanExporter@EnableMBeanExport@Configuration
@Configuration
@EnableMBeanExport
public class AppConfig {
}
如果您更喜欢基于 XML 的配置,则该元素为
相同的目的,如下面的清单所示:<context:mbean-export/>
<context:mbean-export/>
如有必要,您可以提供对特定 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/> | 
不要将基于接口的 AOP 代理与 JMX 的自动检测结合使用
Bean 类中的注解。基于接口的代理 “隐藏” 目标类,该类
还会隐藏 JMX 托管的资源注释。因此,您应该在该
case (通过在 上设置 'proxy-target-class' 标志,依此类推)。否则,您的 JMX bean 可能会在
启动。<aop:config/><tx:annotation-driven/> |