<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 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.0.xsd">

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

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

	<!-- 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 ObjectName from annotation -->
	<bean id="namingStrategy"
		class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
		<property name="attributeSource" ref="jmxAttributeSource" />
	</bean>

	<bean id="testBean" class="AnnotationTestBean">
		<property name="name" value="TEST" />
		<property name="age" value="100" />
	</bean>
</beans>

 

分析上面的配置:

Spring的JMX框架的核心类是 MBeanExporter。这个类负责获取Spring Bean, 然后将其注册到一个JMX MBeanServer 上。

假设有一个有且仅有一个在运作中的 MBeanServer 的环境。这种情况下, Spring将试图定位该 MBeanServer,之后将你的Bean(如果有的话)注册到该服务器上。在自带 MBeanServer 的容器(例如Tomcat或者IBM WebSphere)中,这种行为是很有用的。

 

AnnotationJmxAttributeSource说明了我们要用注解的方式来组装MBean

MetadataMBeanInfoAssembler 使你可以用源码级元数据来定义bean的管理接口。

要通过 MBeanExporter 输出的任意的Bean,并已是有效的MBean,将会被注册到 MBeanServer上去,而无须Spring的干预。 通过设置属性 autodetect 的值为true,MBeanExporter 将会自动探测MBean

 

然而,在一个孤立的环境,或者不提供 MBeanServer 的容器中,这种方法毫无用武之地。 要处理这类问题,你应该创建一个 MBeanServer 实例,也就是声明式地将 org.springframework.jmx.support.MBeanServerFactoryBean 实例添加到你的配置里。 通过设置 MBeanExporterserver 属性的值, 你也可以确保 MBeanExporter 使用了 MBeanServerFactoryBean 返回的特定的 MBeanServer。 例如:

<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>

在exporter中增加属性:

<property name="server" ref="mbeanServer"/>

 

当你提供了你自己的 MBeanServer 实例后,MBeanExporter 将使用该实例,且不再查找一个运行中的 MBeanServer

 

除了 MetadataMBeanInfoAssembler,Spring还包含了 InterfaceBasedMBeanInfoAssembler,它可以根据一组接口定义的方法限定要暴露的方法和属性。虽然使用接口和简单的命名规则是暴露MBean的标准方式,但是 InterfaceBasedMBeanInfoAssembler 扩展这个功能,去除了命名约定,使得你不但可以使用多个接口,还可以省去实现MBean接口的需求。

 

对于每个Bean的注册,MBeanExporter 在后台委派给了 ObjectNamingStrategy 的一个实现来获取 ObjectName。 缺省实现是 KeyNamingStrategy,它将默认使用 beansMap 的键值作为 ObjectName

posted on 2010-12-09 00:48  菊次郎  阅读(1385)  评论(0)    收藏  举报