spring专题征服SpringJava学习笔记

Spring MVC深入源码之一HttpServletBean

2016-12-30  本文已影响1119人  BlairWaldorf

最近想写一些系列文章来深入探讨理解下Spring MVC的运行方式及源码实现。好了,废话不多说了,直接进入正题。

大家都知道一个传统的Web Application都是从web.xml开始的,这个文件也是Application容器加载项目时第一个读取的。对于Spring MVC来说,我们需要在web.xml中配置一个DispatcherServlet作为前端控制器并为其指定一些初始参数。从类名就可以看出,DispatcherServlet本质上还是一个Servlet,只不过多了一些和Spring MVC框架有关的一些功能。

今天打算在这里讲的并不是DispatcherServlet,而是它父类的父类HttpServletBean,下图是一个描述了DispatcherServlet继承结构的图,图中只展示了Spring提供的三个类,其实在往上就是servlet-api中的HttpServlet, GenericServlet等。

好了,开始上源码,先从类声明开始。

public abstract class HttpServletBean extends HttpServlet      
implements EnvironmentCapable, EnvironmentAware {

可以看到HttpServletBean继承了HttpServlet,所以它只是在功能上对HttpServlet进行了一些扩展。并且它实现了EnvironmentCapable和EnvironmentAware接口。

那看到这里,相信大家不禁要问,这个Enviroment又是一个什么东西,它起到了什么样的作用?在这里我不准备展开说,简单来说Environmenti 里封装了3样东西,Spring MVC的profile配置信息,System Properties的一个Map以及System Environment的一个Map。

接下去看一下这个类中的成员变量声明,不多就3个。

protected final Log logger = LogFactory.getLog(getClass());
private final Set<String> requiredProperties = new HashSet<String>();
private ConfigurableEnvironment environment;
protected final void addRequiredProperty(String property) {  
     this.requiredProperties.add(property);
}
@Override
public void setEnvironment(Environment environment) {
     this.environment = (ConfigurableEnvironment) environment;
}

然后我们一起来看一下比较关键的一个方法init,这个方法覆盖了它祖先类GenericServlet中定义的空实现,并且这个方法会在容器初始化每个Servlet的时候被调用一次。


public class PropertyValue extends BeanMetadataAttributeAccessor implements Serializable {   
private final String name;   
private final Object value;
....

那么ServletConfigPropertyValues其实就是一个存放和Servlet相关的参数的容器类,比如那些定义在web.xml中的initParam。

protected void initBeanWrapper(BeanWrapper bw) throws BeansException {
}
<init-param>   
    <param-name>contextConfigLocation</param-name>    
    <param-value>classpath*: *-dispatcher-servlet.xml
</param-value></init-param>

那这个参数的名字和值就会作为一个PropertyVaule存放在ServletConfigPropertyValues中,在128行被调用的时候这个参数的值就会被set到被包裹者实例的相应的属性中, 在这里就是DispatcherServlet的contextConfigLocation中。

public void setContextConfigLocation(String contextConfigLocation) {   
    this.contextConfigLocation = contextConfigLocation;
}

结语:
从源码可以看出,HttpServletBean是在HttpServlet的基础上提供了把Servlet配置中相关的一些属性,参数设置到成员变量上这样的一个功能,这么做的好处就是你可以很方便的通过getter/setter方法去获取参数值,而不是通过一个通用的Map去获取。

在下一篇将会深入分析下HttpServletBean的一个子类FrameworkServlet。

上一篇 下一篇

猜你喜欢

热点阅读