SpringMVC架构代码解析之HttpServletBean

原创 码农  2020-01-06 10:52:18  阅读 344 次 评论 0 条

源码解析


SpringMVC架构代码解析之HttpServletBean SpringMVC架构代码解析之HttpServletBean 架构


org.springframework.web.servlet.HttpServletBean实现了javax.servlet.http.HttpServlet类

HttpServlet的简单扩展,它将配置参数(web.xml中servlet标记中的int -param条目)视为bean属性。任何类型的servlet的方便超类。配置参数的类型转换是自动的,使用转换后的值调用相应的setter方法。子类也可以指定所需的属性。没有匹配bean属性setter的参数将被忽略。

这个servlet将请求处理留给子类,继承HttpServlet的默认行为(doGet、doPost等)。这个通用servlet基类不依赖于Spring org.springframe .context。ApplicationContext的概念。简单的servlet通常不加载它们自己的上下文,而是从Spring根应用程序上下文访问服务bean,可以通过过滤器的ServletContext进行访问(参见org.springframe .web.context.support. webapplicationcontext)。

FrameworkServlet类是一个更特定的servlet基类,它加载自己的应用程序上下文。FrameworkServlet作为Spring成熟的DispatcherServlet的直接基类。

org.springframework.web.servlet.HttpServletBean#init 重写了servlet的方法,将配置参数映射到此servlet的bean属性,并调用子类初始化。

@Override
  public final void init() throws ServletException {
    if (logger.isDebugEnabled()) {
      logger.debug("Initializing servlet '" + getServletName() + "'");
    }

    // Set bean properties from init parameters.
    PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
    if (!pvs.isEmpty()) {
      try {
        BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
        ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
        bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
//        模板方法
        initBeanWrapper(bw);
        bw.setPropertyValues(pvs, true);
      }
      catch (BeansException ex) {
        if (logger.isErrorEnabled()) {
          logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
        }
        throw ex;
      }
    }

    // Let subclasses do whatever initialization they like.模板方法
    initServletBean();

    if (logger.isDebugEnabled()) {
      logger.debug("Servlet '" + getServletName() + "' configured successfully");
    }
  }

这里是模板方法实现,org.springframework.web.servlet.HttpServletBean#initBeanWrapper 初始化HttpServletBean的BeanWrapper,可能使用自定义编辑器。此默认实现为空。

protected void initBeanWrapper(BeanWrapper bw) throws BeansException {  }

org.springframework.web.servlet.HttpServletBean#initServletBean 子类可以覆盖它来执行自定义初始化。在调用此方法之前,将设置此servlet的所有bean属性。此默认实现为空。

protected void initServletBean() throws ServletException {  }
public abstract void setApplicationContext(ApplicationContext applicationContext);

可以设置applicationContext。

@Override
  public final String getServletName() {
    return (getServletConfig() != null ? getServletConfig().getServletName() : null);
  }

获取servletName

  @Override
  public final ServletContext getServletContext() {
    return (getServletConfig() != null ? getServletConfig().getServletContext() : null);
  }

获取servletContext


说在最后

本次解析仅代表个人观点,仅供参考。


本文地址:https://www.itcodeit.com/post/42.html
版权声明:本文为原创文章,版权归 码农 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?