概述
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-a service jboss.level-1-a service 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]
从结果可以看出,两个对象可以排序。
JBoss 系列九十七:JBoss MSC - 浅析 ServiceName