getOrCreateEnvironment()方法源码探究

该方法目的是创建一个环境对象,并且根据环境类型,自动判断是创建web环境对象,还是标准非web环境对象.

首先该方法源于prepareEnvironment准备环境:

getOrCreateEnvironment()方法源码探究

然后进入该方法源码:

getOrCreateEnvironment()方法源码探究

可以发现:根据webEnvironment字段,可以判断要生成的环境的类型,此处添加了web环境的jar包,所以是标准的Servlet环境.

这里直接new StandardServletEnvironment()创建对象,查看StandardServletEnvironment构造器,发现是空实现,好像什么也没做

,其实并非什么都没做,因为创建一个对象,首先去调用父类构造器,如果父类还有父类,则继续向上调用父类构造器,直到顶层父类.

所以下面应该看其父类实现:

getOrCreateEnvironment()方法源码探究

可知:标准的Servlet环境继承了标准环境,标准环境又继承了抽象环境,而前两者构造器均为空实现,顶层父类--抽象环境才有实现.

其调用了customizepropertySources()方法,但是由于该方法是抽象方法,所以实际被调用的是真实调用者的实现,即:标准Servlet环境中的该方法,其方法实现为:

getOrCreateEnvironment()方法源码探究

可知:该方法有3个主要逻辑:添加servletConfigINitParams属性源,添加servletContextInitParams属性源,调用标准环境的customizePropertySources方法.

前两个逻辑简单,后一个调用了标准环境的customizePropertySources方法,源码如下:

getOrCreateEnvironment()方法源码探究

可知:这里有2个逻辑:

获取系统属性集,并封装成一个MapPropertySource属性源,添加

获取系统环境,并封装成一个SystemEnvironmentPropertySorce属性源,添加.

综上可知:创建标准Servlet对象的过程,就是添加4个属性源的过程,这些属性源添加到哪里了呢?是环境对象的propertySources字段.

所以在创建标准Servlet对象过程中,也是对propertySources初始化的过程.

上一篇:Go Revel - Modules(模块)


下一篇:RAFT实践