在Spring 中使用 JMX 要使用 ManagedResource ManagedAttribute 等注解来描述
例子演示
package cn.shendu.springbootlesson17.jmx;
import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.stereotype.Component;
@ManagedResource( objectName = "cn.shendu.springbootlesson17.jmx:type=SimpleBean", description = "这是一个简单的Bean,被spring托管" ) @Component public class SimpleBean { private Long id; private String name; private Integer value;
@ManagedAttribute(description = "ID 属性") public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
@ManagedAttribute(description = "name 属性") public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getValue() { return value; }
public void setValue(Integer value) { this.value = value; }
@Override public String toString() { return "SimpleBean{" + "id=" + id + ", name='" + name + '\'' + ", value=" + value + '}'; } } |
结果演示
源码分析
spring 实现 MBean 要实现 此接口 |
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface ManagedResource |
被 AnnotationJmxAttributeSource 获取并初始化 ManagedResource |
AnnotationJmxAttributeSource 下的
@Override public org.springframework.jmx.export.metadata.ManagedResource getManagedResource(Class<?> beanClass) throws InvalidMetadataException { ManagedResource ann = AnnotationUtils.findAnnotation(beanClass, ManagedResource.class); return managedResource; } |
AnnotationJmxAttributeSource 被 MetadataNamingStrategy初始化 |
MetadataNamingStrategy 下的
public MetadataNamingStrategy(JmxAttributeSource attributeSource) { Assert.notNull(attributeSource, "JmxAttributeSource must not be null"); this.attributeSource = attributeSource; }
|
AnnotationMBeanExporter初始化 metadataNamingStrategy |
AnnotationMBeanExporter 下的
private final MetadataNamingStrategy metadataNamingStrategy = new MetadataNamingStrategy(this.annotationSource);
|
AnnotationMBeanExporter 注册 MBean |
MBeanExporter 下 的 doRegister(mbean, objectName); registeredBean = this.server.registerMBean(mbean, objectName);
|
大概的调用 链是
@interface ManagedResource
被
-- > AnnotationJmxAttributeSource impl JmxAttributeSource : getManagedResource 获取
--> MetadataNamingStrategy : MetadataNamingStrategy(JmxAttributeSource attributeSource)
--> AnnotationMBeanExporter ext MBeanExporter : MetadataNamingStrategy metadataNamingStrategy = new MetadataNamingStrategy(this.annotationSource)
--> MBeanExporter : doRegister --> this.server.registerMBean(mbean, objectName)