此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13spring-doc.cn

上一节的示例中, 您对 Bean 的 Management Interface 几乎没有控制权。每个导出的 bean 的所有属性和方法都作为 JMX 属性和 操作。要对具体内容进行更精细的控制 导出的 bean 的属性和方法实际上作为 JMX 属性公开 和操作,Spring JMX 为 控制 bean 的 Management 接口。publicspring-doc.cn

使用 APIMBeanInfoAssembler

在后台,委托给 API 的实现,即 负责定义每个公开的 bean 的 Management 接口。 默认实现 , 定义公开所有公共属性和方法的管理接口 (如您在前面部分的示例中看到的那样)。Spring 提供两个 接口的其他实现,可让您 使用源级元数据控制生成的管理界面 或任何任意接口。MBeanExporterorg.springframework.jmx.export.assembler.MBeanInfoAssemblerorg.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssemblerMBeanInfoAssemblerspring-doc.cn

使用源级元数据:Java 标注

通过使用 ,您可以定义 使用 source level metadata 的 bean。元数据的读取由接口封装。Spring JMX 提供使用 Java 注解的默认实现,即 .您必须 使用 interface 的 implementation 实例配置 ,使其正常运行,因为没有 default。MetadataMBeanInfoAssemblerorg.springframework.jmx.export.metadata.JmxAttributeSourceorg.springframework.jmx.export.annotation.AnnotationJmxAttributeSourceMetadataMBeanInfoAssemblerJmxAttributeSourcespring-doc.cn

要标记要导出到 JMX 的 Bean,您应该使用注释对 Bean 类进行注释。您必须将您希望公开的每个方法注释为 操作,并注释你想要的每个属性 expose 与 Annotation 一起。在注释属性时,您可以省略 getter 或 setter 的注解,用于创建 write-only 或 read-only 属性。@ManagedResource@ManagedOperation@ManagedAttributespring-doc.cn

带 -ancomments 的 bean 必须是 public 的,公开 操作或属性。@ManagedResource

以下示例显示了该类的带注释版本,我们 用于创建 MBeanServerJmxTestBeanspring-doc.cn

package org.springframework.jmx;

@ManagedResource(
		objectName="bean:name=testBean4",
		description="My Managed Bean",
		log=true,
		logFile="jmx.log",
		currencyTimeLimit=15,
		persistPolicy="OnUpdate",
		persistPeriod=200,
		persistLocation="foo",
		persistName="bar")
public class AnnotationTestBean {

	private int age;
	private String name;

	public void setAge(int age) {
		this.age = age;
	}

	@ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15)
	public int getAge() {
		return this.age;
	}

	@ManagedAttribute(description="The Name Attribute",
			currencyTimeLimit=20,
			defaultValue="bar",
			persistPolicy="OnUpdate")
	public void setName(String name) {
		this.name = name;
	}

	@ManagedAttribute(defaultValue="foo", persistPeriod=300)
	public String getName() {
		return this.name;
	}

	@ManagedOperation(description="Add two numbers")
	@ManagedOperationParameter(name = "x", description = "The first number")
	@ManagedOperationParameter(name = "y", description = "The second number")
	public int add(int x, int y) {
		return x + y;
	}

	public void dontExposeMe() {
		throw new RuntimeException();
	}

}

在前面的示例中,您可以看到该类已批注 with 并配置了此注释 具有一组属性。这些属性可用于配置各个方面 由 生成的 MBean 和 在 greater 中解释 detail 在 Spring JMX 注释中。AnnotationTestBean@ManagedResource@ManagedResourceMBeanExporterspring-doc.cn

和 属性都用 , 但是,对于 property,只有 getter 方法被注解。 这会导致这两个属性都包含在管理界面中 作为托管属性,但该属性是只读的。agename@ManagedAttributeageagespring-doc.cn

最后,该方法用 , 而 method 则不是。这会导致管理界面 仅包含一个操作 () 时。add(int, int)@ManagedOperationdontExposeMe()add(int, int)MetadataMBeanInfoAssemblerspring-doc.cn

该类不需要实现任何 Java 接口, 因为 JMX 管理接口仅从 Comments 派生。AnnotationTestBean

以下配置显示了如何配置 以使用 :MBeanExporterMetadataMBeanInfoAssemblerspring-doc.cn

<beans>

	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="assembler" ref="assembler"/>
		<property name="namingStrategy" ref="namingStrategy"/>
		<property name="autodetect" value="true"/>
	</bean>

	<!-- will create management interface using annotation metadata -->
	<bean id="assembler"
			class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
		<property name="attributeSource" ref="jmxAttributeSource"/>
	</bean>

	<!-- will pick up the ObjectName from the annotation -->
	<bean id="namingStrategy"
			class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
		<property name="attributeSource" ref="jmxAttributeSource"/>
	</bean>

	<bean id="jmxAttributeSource"
			class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>

	<bean id="testBean" class="org.springframework.jmx.AnnotationTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>

</beans>

在前面的示例中,Bean 配置了 实例,并通过 assembler 属性传递给 。这就是利用所需的全部内容 用于 Spring 公开的 MBean 的 Comments 驱动的管理界面。MetadataMBeanInfoAssemblerAnnotationJmxAttributeSourceMBeanExporterspring-doc.cn

带 -ancomments 的 bean 必须是 public 的,公开 操作或属性。@ManagedResource
该类不需要实现任何 Java 接口, 因为 JMX 管理接口仅从 Comments 派生。AnnotationTestBean

Spring JMX 注释

下表描述了可在 Spring JMX 中使用的 Comments:spring-doc.cn

表 1.Spring JMX 注释
注解 适用于 描述

@ManagedResourcespring-doc.cn

spring-doc.cn

将 的所有实例标记为 JMX 托管资源。Classspring-doc.cn

@ManagedNotificationspring-doc.cn

spring-doc.cn

指示托管资源发出的 JMX 通知。spring-doc.cn

@ManagedAttributespring-doc.cn

方法(仅限 getter 和 setter)spring-doc.cn

将 getter 或 setter 标记为 JMX 属性的一半。spring-doc.cn

@ManagedMetricspring-doc.cn

方法(仅限 getter)spring-doc.cn

将 getter 标记为 JMX 属性,并添加 descriptor 属性以指示它是一个量度。spring-doc.cn

@ManagedOperationspring-doc.cn

方法spring-doc.cn

将方法标记为 JMX 操作。spring-doc.cn

@ManagedOperationParameterspring-doc.cn

方法spring-doc.cn

定义操作参数的描述。spring-doc.cn

下表描述了一些可用于 这些注释。有关更多详细信息,请参阅每个注释的 Javadoc。spring-doc.cn

表 2.Spring JMX 注释属性
属性 适用于 描述

objectNamespring-doc.cn

@ManagedResourcespring-doc.cn

用于确定托管资源的 。MetadataNamingStrategyObjectNamespring-doc.cn

descriptionspring-doc.cn

@ManagedResource, , , , ,@ManagedNotification@ManagedAttribute@ManagedMetric@ManagedOperation@ManagedOperationParameterspring-doc.cn

设置资源、通知、属性、指标或操作的描述。spring-doc.cn

currencyTimeLimitspring-doc.cn

@ManagedResource, ,@ManagedAttribute@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。currencyTimeLimitspring-doc.cn

defaultValuespring-doc.cn

@ManagedAttributespring-doc.cn

设置 descriptor 字段的值。defaultValuespring-doc.cn

logspring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。logspring-doc.cn

logFilespring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。logFilespring-doc.cn

persistPolicyspring-doc.cn

@ManagedResource,@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。persistPolicyspring-doc.cn

persistPeriodspring-doc.cn

@ManagedResource,@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。persistPeriodspring-doc.cn

persistLocationspring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。persistLocationspring-doc.cn

persistNamespring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。persistNamespring-doc.cn

namespring-doc.cn

@ManagedOperationParameterspring-doc.cn

设置操作参数的显示名称。spring-doc.cn

indexspring-doc.cn

@ManagedOperationParameterspring-doc.cn

设置操作参数的索引。spring-doc.cn

表 1.Spring JMX 注释
注解 适用于 描述

@ManagedResourcespring-doc.cn

spring-doc.cn

将 的所有实例标记为 JMX 托管资源。Classspring-doc.cn

@ManagedNotificationspring-doc.cn

spring-doc.cn

指示托管资源发出的 JMX 通知。spring-doc.cn

@ManagedAttributespring-doc.cn

方法(仅限 getter 和 setter)spring-doc.cn

将 getter 或 setter 标记为 JMX 属性的一半。spring-doc.cn

@ManagedMetricspring-doc.cn

方法(仅限 getter)spring-doc.cn

将 getter 标记为 JMX 属性,并添加 descriptor 属性以指示它是一个量度。spring-doc.cn

@ManagedOperationspring-doc.cn

方法spring-doc.cn

将方法标记为 JMX 操作。spring-doc.cn

@ManagedOperationParameterspring-doc.cn

方法spring-doc.cn

定义操作参数的描述。spring-doc.cn

表 2.Spring JMX 注释属性
属性 适用于 描述

objectNamespring-doc.cn

@ManagedResourcespring-doc.cn

用于确定托管资源的 。MetadataNamingStrategyObjectNamespring-doc.cn

descriptionspring-doc.cn

@ManagedResource, , , , ,@ManagedNotification@ManagedAttribute@ManagedMetric@ManagedOperation@ManagedOperationParameterspring-doc.cn

设置资源、通知、属性、指标或操作的描述。spring-doc.cn

currencyTimeLimitspring-doc.cn

@ManagedResource, ,@ManagedAttribute@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。currencyTimeLimitspring-doc.cn

defaultValuespring-doc.cn

@ManagedAttributespring-doc.cn

设置 descriptor 字段的值。defaultValuespring-doc.cn

logspring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。logspring-doc.cn

logFilespring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。logFilespring-doc.cn

persistPolicyspring-doc.cn

@ManagedResource,@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。persistPolicyspring-doc.cn

persistPeriodspring-doc.cn

@ManagedResource,@ManagedMetricspring-doc.cn

设置 descriptor 字段的值。persistPeriodspring-doc.cn

persistLocationspring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。persistLocationspring-doc.cn

persistNamespring-doc.cn

@ManagedResourcespring-doc.cn

设置 descriptor 字段的值。persistNamespring-doc.cn

namespring-doc.cn

@ManagedOperationParameterspring-doc.cn

设置操作参数的显示名称。spring-doc.cn

indexspring-doc.cn

@ManagedOperationParameterspring-doc.cn

设置操作参数的索引。spring-doc.cn

使用界面AutodetectCapableMBeanInfoAssembler

为了进一步简化配置, Spring 包括了接口,该接口扩展了接口以添加对 MBean 资源的自动检测的支持。如果使用 的实例配置 ,则为 允许 “投票” 包含用于 JMX 的 bean。AutodetectCapableMBeanInfoAssemblerMBeanInfoAssemblerMBeanExporterAutodetectCapableMBeanInfoAssemblerspring-doc.cn

接口的唯一实现是 ,它投票以包括任何标记为 替换为属性。在这种情况下,默认方法是使用 bean name 设置为 ,这将产生类似于以下内容的配置:AutodetectCapableMBeanInfoMetadataMBeanInfoAssemblerManagedResourceObjectNamespring-doc.cn

<beans>

	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<!-- notice how no 'beans' are explicitly configured here -->
		<property name="autodetect" value="true"/>
		<property name="assembler" ref="assembler"/>
	</bean>

	<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
		<property name="attributeSource">
			<bean class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
		</property>
	</bean>

	<bean id="testBean" class="org.springframework.jmx.AnnotationTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>

</beans>

请注意,在前面的配置中,没有 bean 传递给 . 但是,它仍然被注册,因为它被注释了 并且 检测到这一点并投票包含 它。这种方法的唯一缺点是 now 的名称 具有商业意义。您可以通过配置 来解决此问题,如控制 ObjectName 实例中所述 你的豆子。您还可以查看一个示例,该示例使用 Using Source-level Metadata: Java Annotations.MBeanExporterAnnotationTestBean@ManagedResourceMetadataMBeanInfoAssemblerAnnotationTestBeanObjectNamingStrategyMetadataNamingStrategyspring-doc.cn

使用 Java 接口定义管理接口

除了 之外,Spring 还包括 ,它允许您约束 methods 和 属性,这些属性根据 接口。MetadataMBeanInfoAssemblerInterfaceBasedMBeanInfoAssemblerspring-doc.cn

尽管公开 MBean 的标准机制是使用接口和简单的 命名方案,通过以下方式扩展此功能 无需命名约定,让您使用多个接口 以及消除 bean 实现 MBean 接口的需要。InterfaceBasedMBeanInfoAssemblerspring-doc.cn

请考虑以下接口,该接口用于定义我们前面展示的类的管理接口:JmxTestBeanspring-doc.cn

public interface IJmxTestBean {

	public int add(int x, int y);

	public long myOperation();

	public int getAge();

	public void setAge(int age);

	public void setName(String name);

	public String getName();

}

此接口定义作为操作公开的方法和属性,并且 属性。以下代码显示了如何配置 Spring JMX 以使用 此接口作为 Management Interface 的定义:spring-doc.cn

<beans>

	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="beans">
			<map>
				<entry key="bean:name=testBean5" value-ref="testBean"/>
			</map>
		</property>
		<property name="assembler">
			<bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
				<property name="managedInterfaces">
					<value>org.springframework.jmx.IJmxTestBean</value>
				</property>
			</bean>
		</property>
	</bean>

	<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>

</beans>

在前面的示例中,配置为在为任何 bean 构造 Management 接口时使用该接口。是的 重要的是要了解由 处理的 bean 不需要实现用于生成 JMX 管理的接口 接口。InterfaceBasedMBeanInfoAssemblerIJmxTestBeanInterfaceBasedMBeanInfoAssemblerspring-doc.cn

在上述情况下,该接口用于构造所有管理 所有 bean 的接口。在许多情况下,这不是所需的行为,您可能会 希望对不同的 bean 使用不同的接口。在这种情况下,您可以通过属性传递实例,其中每个条目的键是 Bean 名称,每个条目的值是 用于该 bean 的接口名称的逗号分隔列表。IJmxTestBeanInterfaceBasedMBeanInfoAssemblerPropertiesinterfaceMappingsspring-doc.cn

如果未通过 或 属性指定管理接口,则 在 Bean 上,并使用该 Bean 实现的所有接口来创建 管理界面。managedInterfacesinterfaceMappingsInterfaceBasedMBeanInfoAssemblerspring-doc.cn

MethodNameBasedMBeanInfoAssembler

MethodNameBasedMBeanInfoAssembler用于指定方法名称列表 作为属性和操作向 JMX 公开。下面的代码显示了一个示例 配置:spring-doc.cn

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
	<property name="beans">
		<map>
			<entry key="bean:name=testBean5" value-ref="testBean"/>
		</map>
	</property>
	<property name="assembler">
		<bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
			<property name="managedMethods">
				<value>add,myOperation,getName,setName,getAge</value>
			</property>
		</bean>
	</property>
</bean>

在前面的示例中,您可以看到 and 方法作为 JMX 公开 操作、 、 和 以及 作为 适当的 JMX 属性的一半。在上面的代码中,方法映射适用于 向 JMX 公开的 bean。要逐个 bean 控制方法公开,可以使用 将 bean 名称映射到 的属性 方法名称列表。addmyOperationgetName()setName(String)getAge()methodMappingsMethodNameMBeanInfoAssemblerspring-doc.cn