对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

控制 Bean 的 ObjectName 个实例

在幕后,MBeanExporter 会将任务委托给 ObjectNamingStrategy 的实现,以获取每个它注册的 bean 的 ObjectName 实例。 默认情况下,默认实现 KeyNamingStrategy 使用 beans Map 的键作为 ObjectName。此外,KeyNamingStrategy 可以将 beans Map 的键映射到 Properties 文件(或文件)中的条目来解析 ObjectName。除了 KeyNamingStrategy 外,Spring 还提供了两个额外的 ObjectNamingStrategy 实现: IdentityNamingStrategy(根据 bean 的 JVM 身份构建 ObjectName)和 MetadataNamingStrategy(使用源级元数据来获取 ObjectName)。spring-doc.cadn.net.cn

从属性中读取 ObjectName 个实例

您可以配置自己的 KeyNamingStrategy 实例,并将其配置为从 ObjectName 实例读取 Properties 实例,而不是使用 bean 键。 KeyNamingStrategy 会尝试在 Properties 中查找与 bean 键对应的条目。如果未找到条目或者 Properties 实例是 null,则会直接使用 bean 键。spring-doc.cadn.net.cn

以下代码显示了 KeyNamingStrategy 的示例配置:spring-doc.cadn.net.cn

<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实例和映射属性中定义路径的属性文件合并而成。在此配置中,testBean bean 被赋予一个ObjectName,其值为bean:name=testBean1,因为这是与 bean 键对应的Properties实例中的条目。spring-doc.cadn.net.cn

如果在 Properties 实例中找不到条目,则使用 bean 键名称作为 ObjectNamespring-doc.cadn.net.cn

使用 MetadataNamingStrategy

MetadataNamingStrategy 使用 objectName 属性的 ManagedResource 属性来创建 ObjectName。以下代码显示了 MetadataNamingStrategy 的配置:spring-doc.cadn.net.cn

<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>

如果没有为 objectName 属性提供 ManagedResource,则会创建一个 ObjectName,其格式如下: [全限定包名称]:type=[短类名],name=[bean 名称]。例如,以下 bean 生成的 ObjectName 将是 com.example:type=MyClass,name=myBeanspring-doc.cadn.net.cn

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

配置基于注解的MBean导出

如果您更倾向于使用 基于注解的方法 来定义您的管理接口,可以使用 MBeanExporter 的便捷子类: AnnotationMBeanExporter。在定义此子类的实例时,不再需要 namingStrategyassemblerattributeSource 配置, 因为其始终使用标准的 Java 注解元数据(自动检测也始终启用)。实际上,而不是定义一个 MBeanExporter bean,还支持通过 @EnableMBeanExport @Configuration 注解实现更简单的语法, 如下例所示:spring-doc.cadn.net.cn

@Configuration
@EnableMBeanExport
public class AppConfig {

}

如果您更倾向于使用基于XML的配置,<context:mbean-export/>元素具有相同的作用,如以下清单所示:spring-doc.cadn.net.cn

<context:mbean-export/>

如有必要,您可以提供对特定MBean server 的引用,并且 defaultDomain 属性(AnnotationMBeanExporter 的属性)可以为生成的MBean ObjectName 域指定替代值。如上一节关于 MetadataNamingStrategy 所述,此方法用于代替全限定包名称,如下例所示:spring-doc.cadn.net.cn

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

}

下面的示例显示了前面基于注解的示例的XML等效内容:spring-doc.cadn.net.cn

<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
不要将基于接口的AOP代理与你的bean类中的JMX注解自动检测功能结合使用。基于接口的代理会“隐藏”目标类,这也会隐藏JMX管理的资源注解。因此,在这种情况下,你应该使用基于目标类的代理(通过在<aop:config/><tx:annotation-driven/>等上设置'proxy-target-class'标志)。否则,你的JMX bean可能在启动时被静默忽略。