|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
控制 Bean 的 ObjectName 个实例
在幕后,MBeanExporter 会将任务委托给 ObjectNamingStrategy 的实现,以获取每个它注册的 bean 的 ObjectName 实例。
默认情况下,默认实现 KeyNamingStrategy 使用 beans Map 的键作为 ObjectName。此外,KeyNamingStrategy 可以将 beans Map 的键映射到 Properties 文件(或文件)中的条目来解析 ObjectName。除了 KeyNamingStrategy 外,Spring 还提供了两个额外的 ObjectNamingStrategy 实现: IdentityNamingStrategy(根据 bean 的 JVM 身份构建 ObjectName)和 MetadataNamingStrategy(使用源级元数据来获取 ObjectName)。
从属性中读取 ObjectName 个实例
您可以配置自己的 KeyNamingStrategy 实例,并将其配置为从 ObjectName 实例读取 Properties 实例,而不是使用 bean 键。 KeyNamingStrategy 会尝试在 Properties 中查找与 bean 键对应的条目。如果未找到条目或者 Properties 实例是 null,则会直接使用 bean 键。
以下代码显示了 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>
前面的示例将一个KeyNamingStrategy实例配置为使用一个Properties实例,该实例由映射属性定义的Properties实例和映射属性中定义路径的属性文件合并而成。在此配置中,testBean bean 被赋予一个ObjectName,其值为bean:name=testBean1,因为这是与 bean 键对应的Properties实例中的条目。
如果在 Properties 实例中找不到条目,则使用 bean 键名称作为 ObjectName。
使用 MetadataNamingStrategy
MetadataNamingStrategy 使用 objectName 属性的 ManagedResource 属性来创建 ObjectName。以下代码显示了 MetadataNamingStrategy 的配置:
<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=myBean:
<bean id="myBean" class="com.example.MyClass"/>
配置基于注解的MBean导出
如果您更倾向于使用 基于注解的方法 来定义您的管理接口,可以使用 MBeanExporter 的便捷子类:
AnnotationMBeanExporter。在定义此子类的实例时,不再需要 namingStrategy、assembler 和 attributeSource 配置,
因为其始终使用标准的 Java 注解元数据(自动检测也始终启用)。实际上,而不是定义一个 MBeanExporter bean,还支持通过 @EnableMBeanExport @Configuration 注解实现更简单的语法,
如下例所示:
@Configuration
@EnableMBeanExport
public class AppConfig {
}
如果您更倾向于使用基于XML的配置,<context:mbean-export/>元素具有相同的作用,如以下清单所示:
<context:mbean-export/>
如有必要,您可以提供对特定MBean server 的引用,并且
defaultDomain 属性(AnnotationMBeanExporter 的属性)可以为生成的MBean ObjectName 域指定替代值。如上一节关于
MetadataNamingStrategy 所述,此方法用于代替全限定包名称,如下例所示:
@EnableMBeanExport(server="myMBeanServer", defaultDomain="myDomain")
@Configuration
ContextConfiguration {
}
下面的示例显示了前面基于注解的示例的XML等效内容:
<context:mbean-export server="myMBeanServer" default-domain="myDomain"/>
不要将基于接口的AOP代理与你的bean类中的JMX注解自动检测功能结合使用。基于接口的代理会“隐藏”目标类,这也会隐藏JMX管理的资源注解。因此,在这种情况下,你应该使用基于目标类的代理(通过在<aop:config/>、<tx:annotation-driven/>等上设置'proxy-target-class'标志)。否则,你的JMX bean可能在启动时被静默忽略。 |