JBoss 系列九十七:JBoss MSC - 浅析 ServiceName

来源:互联网 发布:手机照相翻译软件 编辑:程序博客网 时间:2024/05/01 08:45

概述

JBoss MSC 是WildFly 8 和 JBoss 7的底层容器。它管理 JBoss 中的所有 Service,JBoss 中的每一个Service都有一个名字,JBoss MSC通过 ServiceName 对象来抽象Service的名字,ServiceName 代吗链接:ServiceName.java,类图如下:


树状结构

WildFly 中的一切都是一个Service,每个 Service 都有一个名字,Service 之间有树形关系,所以 ServiceName 也是树状结构,如下代码端:

ServiceName root = ServiceName.JBOSS;ServiceName l1a = root.append("level-1-a");ServiceName l1b = root.append("level-1-b");ServiceName l2a = l1a.append("level-2-a");ServiceName l2b = l1a.append("level-2-b");System.out.println(l2a);System.out.println(l2a.getParent());System.out.println(l2a.getParent().getParent());

首先我们获取根节点,接着在根节点上添加两个子节点 level-1-a 和 level-1-b,最后在level-1-a 节点添加两个子节点 level-2-a 和 level-2-b,运行输出如下:

service jboss.level-1-a.level-2-aservice jboss.level-1-aservice jboss

如下代码可以快速创建一个 ServiceName 树:

ServiceName tree = ServiceName.of("one", "two", "three");System.out.println(tree);

运行如上代码输出:

service one.two.three

hashCode() 与 equals()

任何一个对象都会有一个hashcode,Wikipedia 的解释如下链接:

 http://en.wikipedia.org/wiki/Java_hashCode%28%29  

通常:

  • 两个对象equals,它必须有相同的hashCode,同一个对象,任何时候hashCode方法返回必须相同
  • 通常重写equals()方法时,同时重写hashCode()方法,因为两个对象equals是它的hashCode被访问,且只有两个对象的hashCode返回相同
  • hash table 等 hash 相关的数据结构需要使用 hashCode 和 equals 方法
如下代码段:

ServiceName a = ServiceName.JBOSS.append("one", "two", "three");ServiceName b = ServiceName.JBOSS.append("one", "two", "three");System.out.println(a.equals(b));

运行输出的结果为 true,说明 ServiceName a 和 b 形同,即 a 的 equals 方法返回 true,这一输出是因为,执行equals 方法时,a 和 b 返回的 hashCode 是相同的。

如下代码段:

ServiceName a = ServiceName.JBOSS.append("one", "two", "three");ServiceName b = ServiceName.JBOSS.append("one", "two", "three");Set<ServiceName> set = new HashSet<ServiceName>();set.add(a);set.add(b);System.out.println(set.size());

运行输出HashSet的 size 为 1,如上向 HashSet 中添加对象过程如下:

  • set.add(a) 执行时,a 对象的hashCode方法调运
  • set.add(b) 执行时,b 对象的hashCode方法调运;b 对象的 equals() 方法调运;a 对象的hashCode方法调运;b 对象的hashCode方法调运
由于 b 对象的 equals() 方法调运返回true,且hashCode方法返回相同,所以HashSet认为 b 对象已经存在于 HashSet中。

注意:只有当  equals() 方法返回 true且 hashCode方法返回,HashSet认为他们属于同一对象。

Comparable接口

Comparable接口使对象可以比较大小,通常用于排序,ServiceName 实现了 Comparable接口的 compareTo() 方法。通常compareTo()  方法返回 大于 0 的整数,0 或小于 0 的整数:

  • 大于 0 的整数 - 表述 a 对象 大于 b 对象
  • 0 - 表述 a 对象 小于 b 对象
  • 小于 0 的整数 - 表述 a 对象 小于 b 对象
如下代码段:

ServiceName a = ServiceName.JBOSS.append("one");ServiceName b = ServiceName.JBOSS.append("one", "two");List<ServiceName> list = new ArrayList<ServiceName>();list.add(b);list.add(a);System.out.println(list);Collections.sort(list);System.out.println(list);

运行如上代码段输出结果如下:

[service jboss.one.two, service jboss.one][service jboss.one, service jboss.one.two]

从结果可以看出,两个对象可以排序。

0 0