上一篇博客springMVC源碼分析--AbstractUrlHandlerMapping(三)中我們介紹了AbstractUrlHandlerMapping,主要介紹了一個handlerMap的url和Handler的關係存取的過程。
在上一博客中我們介紹了handlerMap有一個註冊url和Handler關係的註冊函數,這個函數的調用是在實現類SimpleUrlHandlerMapping中實現的,目的是springMVC容器啓動時將url和handler的對應關係註冊到handlerMap中。
SimpleUrlHandlerMapping有一個初始化容器上下問的操作,調用父類的super.initApplicationContext會將bean注入到容器中,registerHandlers將url和Handler的對應關係註冊到urlMap中,容器初始化之後會調用setMappings或者setUrlMap將url和handler的對應關係註冊的urlMap中。
-
public void setMappings(Properties mappings) {
-
CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap);
-
}
-
-
public void setUrlMap(Map<String, ?> urlMap) {
-
this.urlMap.putAll(urlMap);
-
}
-
-
@Override
-
public void initApplicationContext() throws BeansException {
-
super.initApplicationContext();
-
registerHandlers(this.urlMap);
-
}
registerHandlers的實現如下,會調用上一篇博客中我們介紹的registerHandler函數,完成url和handler的關係註冊。
-
-
protected void registerHandlers(Map<String, Object> urlMap) throws BeansException {
-
if (urlMap.isEmpty()) {
-
logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");
-
}
-
else {
-
for (Map.Entry<String, Object> entry : urlMap.entrySet()) {
-
String url = entry.getKey();
-
Object handler = entry.getValue();
-
-
if (!url.startsWith("/")) {
-
url = "/" + url;
-
}
-
-
if (handler instanceof String) {
-
handler = ((String) handler).trim();
-
}
-
registerHandler(url, handler);
-
}
-
}
-
}
越是到了實現子類,子類需要完成的功能越少,SimpleUrlHandlerMapping完成的工作就是容器初始化時獲取所有的url和handler的對應關係,將url和handler的關係註冊到handlerMap中即可,它的使命就完成了。
SimpleUrlHandlerMapping完整代碼如下:
-
public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping {
-
-
private final Map<String, Object> urlMap = new HashMap<String, Object>();
-
-
-
-
public void setMappings(Properties mappings) {
-
CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap);
-
}
-
-
public void setUrlMap(Map<String, ?> urlMap) {
-
this.urlMap.putAll(urlMap);
-
}
-
-
-
public Map<String, ?> getUrlMap() {
-
return this.urlMap;
-
}
-
-
-
-
@Override
-
public void initApplicationContext() throws BeansException {
-
super.initApplicationContext();
-
registerHandlers(this.urlMap);
-
}
-
-
-
protected void registerHandlers(Map<String, Object> urlMap) throws BeansException {
-
if (urlMap.isEmpty()) {
-
logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");
-
}
-
else {
-
for (Map.Entry<String, Object> entry : urlMap.entrySet()) {
-
String url = entry.getKey();
-
Object handler = entry.getValue();
-
-
if (!url.startsWith("/")) {
-
url = "/" + url;
-
}
-
-
if (handler instanceof String) {
-
handler = ((String) handler).trim();
-
}
-
registerHandler(url, handler);
-
}
-
}
-
}
-
-
}