// 建立name和broker的映射
Map<String, URIBrokerInfo> brokerInfoMap = createLinkedHashMap();
for (URIBrokerInfo brokerInfo : brokerInfos) {
URIBroker broker = assertNotNull(brokerInfo == null ? null : brokerInfo.broker, "broker");
brokerInfo.name = assertNotNull(trimToNull(brokerInfo.name), "broker ID");
brokerInfo.parentName = trimToNull(brokerInfo.parentName);
assertTrue(!brokerInfoMap.containsKey(brokerInfo.name), "duplicated broker ID: %s", brokerInfo.name);
brokerInfoMap.put(brokerInfo.name, brokerInfo);
brokers.put(brokerInfo.name, broker);
names.add(brokerInfo.name);
if (brokerInfo.exposed) {
exposedNames.add(brokerInfo.name);
}
// 设置顶级uri的默认值,除非设置了requestAware,否则保持broker中的默认值
if (requestAware != null && brokerInfo.parentName == null) {
broker.setRequestAwareDefault(requestAware);
}
// 设置顶级uri的默认值,除非设置了defaultCharset,否则保持默认的broker charset。
if (defaultCharset != null && brokerInfo.parentName == null && broker.getCharset() == null) {
broker.setCharset(defaultCharset);
}
broker.setRequest(request);
}
brokerInfos = null;
// import uris
if (!isEmptyArray(importUris)) {
for (URIBrokerService importUriBrokerService : importUris) {
Set<String> exposedImportNames = createHashSet(importUriBrokerService.getExposedNames());
for (String name : importUriBrokerService.getNames()) {
// 允许当前文件中的uri覆盖parent中的同名uri。
if (brokers.containsKey(name)) {
continue;
}
URIBroker uri = importUriBrokerService.getURIBroker(name);
if (uri.isAutoReset() && uri.getParent() != null && !uri.getParent().isAutoReset()) {
uri = uri.getParent();
} else {
uri = uri.fork(false);
}
brokers.put(name, uri);
names.add(name);
if (exposedImportNames.contains(name)) {
exposedNames.add(name);
}
}
}
}
// 设置parent brokers,确保parent broker在类层次上也是父类或同类,同时确保没有递归派生
for (Map.Entry<String, URIBrokerInfo> entry : brokerInfoMap.entrySet()) {
String name = entry.getKey();
URIBrokerInfo brokerInfo = entry.getValue();
String parentName = brokerInfo.parentName;
// 检查继承链,确保没有递归
checkCyclic(brokerInfoMap, name, parentName);
if (parentName != null) {
URIBroker parentBroker = assertNotNull(brokers.get(parentName),
"parent \"%s\" not found for broker \"%s\"", parentName, brokerInfo.name);
URIBroker thisBroker = brokerInfo.broker;
thisBroker.setParent(parentBroker);
}
}
// 递归复制parent中的信息
for (URIBroker broker : brokers.values()) {