MBean与MXBean的区别

               
MBean其实也是JavaBean的一种,但是MBean往往代表的是JMX中的一种可以被管理的资源。MBean会通过接口定义,给出这些资源的一些特定操作:
  1. 属性的读和写操作;
  2. 可以被执行的操作;
  3. 关于自己的描述信息;
MBean可以看作是JavaBean的一种特殊形式,其定义是符合JavaBean的规范的。但是MBean在定义是,首先需要定义一个名字结尾为“MBean”的接口,例如:HelloMBean,然后这个接口的实现类的名字必须叫做Hello。 
而MXBean与MBean的区别主要是在于在接口中会引用到一些其他类型的类时,其表现方式的不一样。在MXBean中,如果一个MXBean的接口定义了一个属性是一个自定义类型,如MemoryMXBean中定义了heapMemoryUsage属性,这个属性是MemoryUsage类型的,当JMX使用这个MXBean时,这个MemoryUsage就会被转换成一种标准的类型,这些类型被称为开放类型,是定义在 javax.management.openmbean包中的。而这个转换的规则是,如果是原生类型,如int或者是String,则不会有变化,但如果是其他自定义类型,则被转换成CompositeDataSupport类。
用两个简单的例子来比较一下MBean与MXBean的区别。
定义一个MBean:
public interface HelloMBean {    public int getAge();    public String getName();    public String getEmail();    public void setEmail(String email);    public String sayHello();}
这个MBean定义了三个属性:age,name和email,其中age和name是只读的。同时定义了一个操作,sayHello。下面是这个MBean的实现:
public class Hello implements HelloMBean {  private final String name; private final int age; private String email;  public Hello(String name, int age, String email) {  this.name = name;  this.age = age;  this.email = email; } @Override public int getAge() {  return age; } @Override public String getName() {  return name; } @Override public String getEmail() {  return email; } @Override public void setEmail(String email) {  this.email = email; } @Override public String sayHello() {  return "Hello, I'm " + name + "."; }}
上面这个MBean的实现,可以看到,这个实现类的名字与MBean接口的定义是相同的。然后再写一个调用的类:
public class MyMBeanServer public static void main(String[] args) throws Exception {  MBeanServer server = ManagementFactory.getPlatformMBeanServer();    ObjectName mbeanName = new ObjectName("me.clarenceau.jmx.mbean:type=Hello");    Hello mbean = new Hello("ClarenceAu", 23, "ozhencong@gmail.com");    server.registerMBean(mbean, mbeanName);    System.out.println("Wait ...");  Thread.sleep(Long.MAX_VALUE); }}
然后启动这个类,再通过jconsole就可以看到这个mbean的属性以及调用这个mbean的操作。




 
然后下面可以试一下定义一个自定义类型,然后在mbean中作为属性来返回,我们定义一个Book类型:
public class Book {    public String name;    public double price;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }}
在原来的mbean上增加两个操作:
public Book getBook();public void addBook(Book book);
再次启动server,看看这次效果会怎么样:


可以看到,属性和操作都多了刚才定义的内容。但是如果希望看到book的内容时就会看到下面的情况:

这时,我们把这个mbean定义为一个MXBean:
public interface HelloMXBean {    public int getAge();    public String getName();    public String getEmail();    public void setEmail(String email);    public String sayHello();    public Book getBook();    public void addBook(Book book);}
并且在Server类启动时,为mbean添加几本书:
public class MyMXBeanServer public static void main(String[] args) throws Exception {  MBeanServer server = ManagementFactory.getPlatformMBeanServer();    ObjectName mbeanName = new ObjectName("me.clarenceau.jmx.mxbean:type=Hello");    Hello mbean = new Hello("ClarenceAu", 23, "ozhencong@gmail.com");  mbean.addBook(new Book("Thinking in Java", 99.0));  mbean.addBook(new Book("Design Pattern", 59.0));    server.registerMBean(mbean, mbeanName);    System.out.println("Wait ...");  Thread.sleep(Long.MAX_VALUE); }}
启动后,我们可以再通过jconsole看到下图:


此时,book已经被转换成了CompositeDataSupport类型,双击这个这个属性,则可以看到:

这个就是MBean与MXBean的区别所在。

需要注意的是,如果Book类的默认无参构造函数被覆盖,会出现如下问题:

 Do not know how to make a JavaFTP.Book from a CompositeData: no method from(CompositeData); no constructor has @ConstructorProperties annotation; does not have a public no-arg constructor; not an interface

来源  http://www.myexception.cn/program/1241128.html

           
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值