好了,老子不废话了,真金不怕卖钱。
Router bean下有property 名叫processors,所以应该也有个set方法,不然没有办法设置值。我们找到
org.openadaptor.core.router.Router类。
不负众望
public void setProcessors(List processorList){
// create process map from list of processors
if ((processorList==null) || (processorList.isEmpty())) {
throw new RuntimeException("Null or empty processorList is not permitted");
}
Object[] processors=processorList.toArray(new Object[processorList.size()]);
Map processMap = new HashMap();
for (int i=1;i<processors.length;i++){
processMap.put(processors[i-1],processors[i]);
}
setProcessMap(processMap);
}
果然有,大家通过简单阅读代码可以看到这就是个将List设置到Map的过程,那么Map有什么用呢?大家再
仔细看看,不要着急,对了,看到了吧,那个for(;;),它是将一个处理器接着一个处理器塞
到HashMap里面,前面的是顺序用个鲜明的矩阵图来形容吧
1 2
2 3
3 4
4 5
发现什么规律?右边的减左边的等于1,- -,你真不是盖的。
大家想想HashMap的结构是什么样的?<key,value>!
对!
当它循着这个Map的key找的时候会找到value,然后又以这个value为key接着找下一个value,循环直到这
个Map的最后一个值。这样就会把每个processor都执行一遍。
那么有人会问- -!为什么说会这样执行,你怎么知道啊?
好的,来看
setProcessors()里最后一行是什么?
setProcessMap()
好,继续找它,对,还在Router里
public void setProcessMap(Map map) {
if (processMapConfigured) {
throw new RuntimeException("Only one of processMap and processors properties may be
configured");
}
processMapConfigured=true;
routingMap.setProcessMap(map);
}
对,继续
这里设置了processMapConfigured=true;这是为什么呢?LZ下次为你揭开这个神秘的擦脚布。
先把注意力放在routingMap里,它的本类是RoutingMap
好,找到
RoutingMap,找到setProcessMap()
public void setProcessMap(Map map) {
processMap.clear();
populateMap(map, processMap);
}
注意populateMap(map,processMap)在执行前,processMap是空的
在这里我们发现了processMap的定义,Sets the processMap which defines how to route output from
one adaptor component to anothers.
是一个定义怎样将一个适配器组件的输出转发到另外一个的集合
首先它把processMap清空了,然后populateMap(map,processMap)
哇擦,天长地久有时尽 程序绵绵无绝期
找到populateMap(map,processMap)
private void populateMap(Map map, Map checkedMap) {
map = autoboxer.autobox(map);
for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
verifyEntryKeyIsIMessageProcessor(entry);
IMessageProcessor fromProcessor = (IMessageProcessor) entry.getKey();
List processorList = autoboxIMessageProcessorList(entry.getValue());
processors.add(fromProcessor);
processors.addAll(processorList);
checkedMap.put(fromProcessor, processorList);
}
}
大家仔细阅读代码发现这就是个将map中的数据先verifyEntryKeyIsIMessageProcessor(entry);
确定map的key是否是MessageProcessor,不是就报错退出了,是就将他强制转换为IMessageProcessor,
然后自动封装,这里真j8操淡,TMD前面设置到Map里面的时候就可以了,现在还要设置到set中,还来个
什么自动封箱,封你妈啊,不过他们也有道理,如果list里面嵌套了另外一个list就把第二
个list的MessageProcessor给漏掉了。现在checkMap里面已经有了所有的MessageProcessor,LZ就要看看
他们要干什吗?
posted on 2010-11-02 17:39
Vigoss 阅读(199)
评论(0) 编辑 收藏