对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
控制 Bean 的实例ObjectName
在幕后,委托给 的实现 以获取它注册的每个 bean 的实例。
默认情况下,默认实现使用 的键作为 .此外,还可以映射 key
的 添加到文件(或文件)中的条目中,以解析 .除了 之外,Spring 还提供了两个额外的实现:(基于 Bean 的 JVM 标识构建一个)和(它
使用源级元数据来获取 )。MBeanExporter
ObjectNamingStrategy
ObjectName
KeyNamingStrategy
beans
Map
ObjectName
KeyNamingStrategy
beans
Map
Properties
ObjectName
KeyNamingStrategy
ObjectNamingStrategy
IdentityNamingStrategy
ObjectName
MetadataNamingStrategy
ObjectName
从属性中读取实例ObjectName
您可以配置自己的实例,并将其配置为从实例读取实例,而不是使用 Bean 密钥。尝试在带有键的
对应于 Bean 键。如果未找到条目或实例为 ,则使用 Bean 键本身。KeyNamingStrategy
ObjectName
Properties
KeyNamingStrategy
Properties
Properties
null
以下代码显示了 的示例配置: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 键。KeyNamingStrategy
Properties
Properties
testBean
ObjectName
bean:name=testBean1
Properties
如果在实例中找不到任何条目,则 Bean 键名用作
这。Properties
ObjectName
用MetadataNamingStrategy
MetadataNamingStrategy
使用每个 Bean 上的属性来创建 .以下代码显示了
的配置 :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>
如果尚未为属性提供 no,则使用以下命令创建一个
格式:[fully-qualified-package-name]:type=[short-classname],name=[bean-name]。为
例如,为以下 bean 生成的将是:objectName
ManagedResource
ObjectName
ObjectName
com.example:type=MyClass,name=myBean
<bean id="myBean" class="com.example.MyClass"/>
配置基于注释的 MBean 导出
如果您更喜欢使用基于注释的方法来定义
您的 Management 接口中,可以使用方便的子类:。定义此子类的实例时,您不再需要 、 和 配置
由于它始终使用基于 Java 注释的标准元数据(autodetection 为
也始终启用)。事实上,与其定义 bean,不如定义偶数
注解支持 simpler 语法,
如下例所示:MBeanExporter
AnnotationMBeanExporter
namingStrategy
assembler
attributeSource
MBeanExporter
@EnableMBeanExport
@Configuration
@Configuration
@EnableMBeanExport
public class AppConfig {
}
如果您更喜欢基于 XML 的配置,则该元素为
相同的目的,如下面的清单所示:<context:mbean-export/>
<context:mbean-export/>
如有必要,您可以提供对特定 MBean 的引用,并且该属性(的属性 )接受替代
值。这用于代替
完全限定的包名称,如上一节所述 MetadataNamingStrategy,如下例所示:server
defaultDomain
AnnotationMBeanExporter
ObjectName
@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/> |