咱们使用MBeanServer时候一般是下面这样的使用方式:dom
MBeanServer server = MBeanServerFactory.createMBeanServer("domain");
最近利用台风“温比亚”路过大连的时候,研究了一下MBeanServer究竟是什么鬼?
首先看我整理的UML的类图;
从下往上看
MBeanServerFactory维护了一个MBeanServerBuilder类型的builder,
MBeanServerFactory的createMBeanServer方法调用本身的newMBeanServer方法,而后调用builder的newMBeanServer方法,
而builder的newMBeanServer直接关联的是JmxMBeanServer.newMBeanServer()方法,此方法内部建立本身的对象,并对维护的三个成员变量赋值操做;
JmxMBeanServer的三个成员变量(图中我只画出了拦截器的关系):
① MBeanInstantiator instantiator 实例化工具
主要负责MBean的实例化
维护了clr = new ClassLoaderRepositorySupport()的对象,经过clr来管理MBean的类加载器
② MBeanServerDelegate mBeanServerDelegateObject 用来监控本身的MBean
③ MBeanServer mbsInterceptor 的拦截器
拦截器→顾名思义咱们从上图能够看到JmxMBeanServer和mbsInterceptor都是实现了MBeanServer的接口,mbsInterceptor又是JmxMBeanServer的依赖,
这样的设计做用是什么呢?源代码咱们能够看出,JmxMBeanServer的ObjectInstance createMBean方法,是直接委托mbsInterceptor的ObjectInstance createMBean去工做的。
mbsInterceptor引用对应的默认实现类:DefaultMBeanServerInterceptor维护了一个Repository类型repository,
repository算是相当重要的了他维护了一个存放MBean的Map:
Map<String,Map<String,NamedObject>> domainTb:
外层Map的key是域,默认是字符串类型的"domain",一般是被初始化的。里层的Map的key是MBean的name,value固然是咱们注册的MBean对象了。
从源代码能够看出JmxMBeanServer其实什么活都没干,就是维护三个小弟干活而已。