此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

控制ObjectNameBean 的实例

在幕后,MBeanExporter委托到ObjectNamingStrategy获取ObjectName实例。 默认情况下,默认实现KeyNamingStrategy使用beans Map作为ObjectName.此外,KeyNamingStrategy可以映射键 的beans MapProperties文件(或多个文件)来解析ObjectName.除了KeyNamingStrategy,Spring 提供了两个额外的ObjectNamingStrategy实现:IdentityNamingStrategy(它构建了一个ObjectName基于 bean 的 JVM 身份)和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由映射属性定义的实例和 属性文件,位于 mappings 属性定义的路径中。在这个 配置,则testBeanbean 被赋予一个ObjectNamebean:name=testBean1, 由于这是Properties实例,该实例具有对应于 豆钥匙。spring-doc.cadn.net.cn

如果Properties实例,则 bean 键名称用作 这ObjectName.spring-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使用以下内容创建 format: [fully-qualified-package-name]:type=[short-classname],name=[bean-name]。为 示例,生成的ObjectName因为下面的 bean 将是com.example:type=MyClass,name=myBean:spring-doc.cadn.net.cn

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

配置基于注释的 MBean 导出

如果您更喜欢使用基于注释的方法来定义 您的管理界面,一个方便的子类MBeanExporter可用:AnnotationMBeanExporter.定义此子类的实例时,不再需要namingStrategy,assemblerattributeSource配置 因为它始终使用基于 Java 注释的标准元数据(自动检测是 也始终启用)。事实上,与其定义MBeanExporterbean,一个偶数 更简单的语法支持@EnableMBeanExport @Configuration注释或<context:mbean-export/>元素,如以下示例所示:spring-doc.cadn.net.cn

@Configuration
@EnableMBeanExport
public class JmxConfiguration {
}
@Configuration
@EnableMBeanExport
class JmxConfiguration
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   https://www.springframework.org/schema/beans/spring-beans.xsd
	   http://www.springframework.org/schema/context
	   https://www.springframework.org/schema/context/spring-context.xsd">

	<context:mbean-export/>
</beans>

如有必要,可以提供对特定 MBean 的引用serverdefaultDomain属性(属性AnnotationMBeanExporter) 接受替代 生成的 MBean 的值ObjectName域。这用于代替 完全限定的包名称,如上一节 MetadataNamingStrategy 所述,如以下示例所示:spring-doc.cadn.net.cn

@Configuration
@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
public class CustomJmxConfiguration {
}
@Configuration
@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
class CustomJmxConfiguration
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   https://www.springframework.org/schema/beans/spring-beans.xsd
	   http://www.springframework.org/schema/context
	   https://www.springframework.org/schema/context/spring-context.xsd">

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