天天看點

springMVC源碼分析--ControllerBeanNameHandlerMapping(八)

在上一篇部落格​​springMVC源碼分析--AbstractControllerUrlHandlerMapping(六)​​中我們介紹到AbstractControllerUrlHandlerMapping定義了抽象方法buildUrlsForHandler,接下來我們看看在其子類ControllerBeanNameHandlerMapping中的實作。

springMVC源碼分析--ControllerBeanNameHandlerMapping(八)

ControllerBeanNameHandlerMapping中buildUrlsForHandler的實作如下,還是講beanName及其别名作為url

@Override
  protected String[] buildUrlsForHandler(String beanName, Class<?> beanClass) {
    List<String> urls = new ArrayList<String>();
    urls.add(generatePathMapping(beanName));
    String[] aliases = getApplicationContext().getAliases(beanName);
    for (String alias : aliases) {
      urls.add(generatePathMapping(alias));
    }
    return StringUtils.toStringArray(urls);
  }      

generatePathMapping函數中的實作是給beanName加上以下字首等。

protected String generatePathMapping(String beanName) {
    String name = (beanName.startsWith("/") ? beanName : "/" + beanName);
    StringBuilder path = new StringBuilder();
    if (!name.startsWith(this.urlPrefix)) {
      path.append(this.urlPrefix);
    }
    path.append(name);
    if (!name.endsWith(this.urlSuffix)) {
      path.append(this.urlSuffix);
    }
    return path.toString();
  }      

和其他的實作子類一樣,ControllerBeanNameHandlerMapping實作的功能很簡單,就是将beanName及其别名作為url傳回。

ControllerBeanNameHandlerMapping源碼如下:

public class ControllerBeanNameHandlerMapping extends AbstractControllerUrlHandlerMapping {

  private String urlPrefix = "";

  private String urlSuffix = "";

  public void setUrlPrefix(String urlPrefix) {
    this.urlPrefix = (urlPrefix != null ? urlPrefix : "");
  }

  public void setUrlSuffix(String urlSuffix) {
    this.urlSuffix = (urlSuffix != null ? urlSuffix : "");
  }

  //通過beanName構造url數組
  @Override
  protected String[] buildUrlsForHandler(String beanName, Class<?> beanClass) {
    List<String> urls = new ArrayList<String>();
    urls.add(generatePathMapping(beanName));
    String[] aliases = getApplicationContext().getAliases(beanName);
    for (String alias : aliases) {
      urls.add(generatePathMapping(alias));
    }
    return StringUtils.toStringArray(urls);
  }
  //給beanName添加配置的字首
  protected String generatePathMapping(String beanName) {
    String name = (beanName.startsWith("/") ? beanName : "/" + beanName);
    StringBuilder path = new StringBuilder();
    if (!name.startsWith(this.urlPrefix)) {
      path.append(this.urlPrefix);
    }
    path.append(name);
    if (!name.endsWith(this.urlSuffix)) {
      path.append(this.urlSuffix);
    }
    return path.toString();
  }

}