getOrCreateEnvironment()方法源码探究

本文详细解析了创建标准Servlet环境对象的过程,通过分析源码,揭示了如何根据环境类型自动选择创建web环境对象或非web环境对象,并介绍了在这个过程中属性源的添加与初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

然后进入该方法源码:

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

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

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

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

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

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

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

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

可知:这里有2个逻辑:

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

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

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

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

 

转载于:https://www.cnblogs.com/wangxuejian/p/10639696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值