从根儿上学习spring 五 之run方法启动第二段

说完了第一段,这篇我们接着来一起分析红框2--第二段。

295--296行:

该行创建了一个DefaultApplicationArguments对象,该对象的大致结构如下

图1

由上图可以看出该对象主要是用于解析java命令行参数并返回里面的options参数和nonOption参数,可能一些同学对这两个概念还不清楚,这里我稍微解释下,命令行指令里使用--或者-开头的参数就是option参数,反之就是non option参数。比如:--v1=12或者-name=jay这里的v1和name就是option参数,再举个例子:--v1=12 /usr/local这里的/usr/local就是non option参数

297-298行:

这两行主要是创建ConfigurableEnvironment spring可配置环境接口。该接口实现了Environment接口,Environment接口主要提供了三个方法,如图2所示:

图2

getActiveProfiles()方法用于获取spring.profiles.active指定的激活的profile,getDefaultProfiles()用于spring.profiles.default指定的默认的profile

acceptsProfiles(String... profiles)方法用于判断传进来的profiles是否为激活状态。

说到这不会有同学还不知道profile是个啥吧?大意了,profile英文翻译过来意思有概要,描述的意思,可以理解为它用来描述一类事物。比如将一个bean描述为profile=dev如下所示

@profile("dev"))
@Component
public class Cat{
    
}

那么如果spring.profiles.active配置了dev,或者spring.profiles.active没配但配了spring.profiles.default有dev的情况下Cat类才会被spring容器加载,到这里大家应该基本了解了profile的大致作用了吧。

Environment接口继承了PropertyResolver接口,PropertyResolver接口主要提供了获取配置属性的方法,如图3所示。

图3

由图3可知PropertyResolver主要提供了对property的获取能力,简单说就是获取我们配置文件里配的属性,如.properties,.yml,环境变量,jvm参数等配置的属性。讲到这里大家只需对Environment接口的能力有个总体上的认识---它提供了获取profile和property的能力。

我们接着回去看代码,我们点进prepareEnvironment方法内部看下。如下图4所示

图4

图4-prepareEnvironment方法336行:

这行调用了getOrCreateEnvironment()去创建了一个ConfigurableEnvironment实现类,由于没啥逻辑就不点进去看了,大家感兴趣自己点进去看下,ConfigurableEnvironment接口作为Environment的子接口扩展了一些能力,这里我们就先不展开了。后面需要的话再了解也不迟。

图4-prepareEnvironment方法--337行:

这行调用了configureEnvironment(environment, applicationArguments.getSourceArgs())方法对刚获取到的environment对象进行一些操作,具体做了啥我们点进去看下。

图5

前面我们简单说过Envirment主要是获取property和profile的,根据上图5可知,这个方法调用了两个方法,似乎分别和property及profile有关。我们先看下第一个方法configurePropertySources(ConfigurableEnvironment environment,String[] args),从方法名猜测似乎是配置property的来源的,我们点进这个方法看下。

图6

configurePropertySources--486行:

该行获取了MutablePropertySources对象,该对象实现了PropertySources接口。我们看下图7的uml类。

图7

PropertySouces接口提供获取PropertySource接口的能力,作为PropertySources接口的唯一实现类MutablePropertySources提供了维护多个PropertySource的能力--基于其集合属性propertySourceList。PropertySouces比较简单,我们再来看下抽象类PropertySouce该类的主要作用是维护property的来源并提供获取property的能力---通过其getPropery(string)方法。该类有两个属性分别是String类型的name和泛型属性source。name表示该PropertySource的名称,source表示property的真正来源提供真正获取property的能力。比如实现类ServletContextPropertySource表示property的来源是servletConext,所以这里的source便是ServletConext实现类。

讲完了PropertySources和PropertySource,我们再回头看图6的方法configurePropertySources方法似乎变得很简单没必要一行行分析了吧,这个方法就是向environment的sources属性里加入启动时的两个PropertySource,有不清楚的同学再结合我上面说的对着代码看两遍就清楚了,我就不再赘述了。

我们接着回去到图5的474行往下分析configureProfiles(environment, args)方法。

图8

让我们把目光转向图8,看下configureProfiles方法的逻辑。从方法名我们就可以猜出来这个方法就是设置profile的主要逻辑就是往environment实现类里的activeProfiles属性里设置spring.profiles.active指定的值。感兴趣的同学自己看下吧比较简单就不多说了。

让我们把目光再投向图4,说完了configureEnvironment方法,是时候往下推进了。

图4--338行

该行的逻辑在之前有说过这里就再简单提下,主要就是执行SpringApplicationRunListener的environmentPrepared方法,通知容器的环境已经准备好了。

图4--338行

这行的逻辑是将property的配置绑定到springApplication类的相关属性上,比如spring.main.web-application-type=none属性将被绑定到springApplication的webApplicationType属性上,具体绑定逻辑比较复杂需要大篇幅描述,感兴趣的请看我另一篇文章:spring 属性绑定 binder

总结

到这里我们已经把第二段讲的差不多了,这一段主要是对spring environment环境的准备,主要是配置propertySource和设置profile,有了环境之后要spring又要干些啥呢?我们下节继续。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值