上面一节我们简单的了解spring-cloud-commons做了云服务的一些标准抽象,各大厂商在此标准上做了很多不同的云服务实现方案,比如netflix-eureka,cloud-zookeeper,cloud-alibaba等,这些实现方案是对sping-cloud-commons的具体实现。能够提供完整的Spring-cloud的功能。但是这些实现都是基于Spring-cloud体系实现的,而Spring-boot可以基于Spring-boot进行快速搭建和开发。那我们就简单的看下Spring-cloud是怎么扩展的Springboot。
其实基于前面《spring-boot》系列,大家应该知道,Spring-boot为了扩展Spring-framework,引入基本组件SpringApplication。所以Springboot的基础组件如下
在SpringApplication的帮助下,Spring-boot扩展了ApplicationContext的生命周期,因为我们之前在监听ApplicationContext的声明周期事件的时候,只能监听到4种:
- ContextStartedEvent
- ContextRefreshEvent
- ContextStopEvent
- ContextClosedEvent
而在Springboot中,我们可以多监听6种SpringApplication的事件
-
ApplicationStartingEvent
-
ApplicationEnvironmentPreparedEvent
-
ApplicationPreparedEvent
-
ApplicationStartedEvent
-
ApplicationReadyEvent
-
ApplicationFailedEvent
spring-cloud就是因为监听了ApplicationEnvironmentPreparedEvent事件,做到了云服务的功能扩展。这个地方就要介绍一个对云服务特别重要的事件监听类:
BootstrapApplicationListener
这个类是spring-cloud引入的,是创建一个bootstrap的ApplicationContext,作为Springboot创建的ApplicaitionContext的父context。
有个需要注意的事情,BootstrapApplicationListener会修改Environment,这个Environment是父子公用的,BootstrapApplicationListener会新建一个名叫:“bootstrap”的PropertyResources加入到Environment的PropertySources中。bootstrap的propertyResources会读取bootstrap.yaml或者bootstrap.properties中的配置。所以一般spring-cloud需要用到的属性,会放置在bootstrap.yaml。比如spring.application.name。不过根据Environment的运行原理,我们把spring.application.name放置到application.yaml里面也可以。但是为了遵循规约,我们还是要新建一个bootstrap.yaml文件。