暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Cloud Bootstrap

花好夜猿 2019-02-25
659

什么是上下文?


在一篇文章中,文章的上下文就是通篇文章的语境。而程序中的上下文,可以理解为整个应用程序的环境。


不同语言,不同的应用场景,存在不同的上下文。

在java web开发中,从 servlet 中的 ServletContext 到 spring 中的 ApplicationContext 在到 spring cloud 的bootstrap。


上下文在程序运行中起到承上启下的作用,这些上下文存储了系统相关的一些初始化信息,比如配置信息等。而这些上下文在程序运行过程中都能够通过特定的方式被获取到,并作用于业务代码中。


The Bootstrap Application Context


A Spring Cloud application operates by creating a "bootstrap" context, which is a parent context for the main application


根据官方文档给出的话中,我们可以知道 bootstrap 是 Spring Cloud 新引入的上下文 , 且 bootstrap 上下文是 application 上下文 的父容器。


bootstrap 在程序运行中如何被创建


在之前文章 Event-driven Architecture 中,我们提到了EDA 架构模式。也提到了 spring 对于该模式的实现。

而 Bootstrap 上下文的创建也是通过事件监听的方式进行创建的。其事件源为 ApplicationEnvironmentPreparedEvent ,事件监听器为 BootstrapApplicationListener。


跟踪源码查看 bootstrap 如何被创建


部分代码:



在官方介绍中提到了  bootstrap 是  application 的父容器,那么我们就来验证一下


验证一:通过 actuator 端点信息查看 /beans 查看数据信息
环境准备:

  1. 在项目中引入spring-boot-actuator 模块;

  2. 在配置文件中增加配置

 3.请求接口 http://localhost:9527/beans

返回内容

验证二:通过查看源码得知加载顺序

通过代码我们可以知道在 执行 prepareEnvironment 环境准备的时候进行了 bootstrap 上下文的创建。而 application 上下文的创建是在 IOC 容器创建的时候在加载的, 显而易见,bootstrap 的创建优先于 application。


再来看 BootstrapApplicationListener 


在监听创建的时候,bootstrap 就被设定为 application 的父容器。

在到后来 SpringApplication->run() 中的



只要 bootstrap 上下文存在,在下面的操作中的 application context 都是在 bootstrap 初始化时被创建,当 bootstrap 不存在时则默认重新创建一个新的 application context 容器。


综上可以得出结论:在存在 bootstrap 上下文的程序中,bootstrap 是 application 的父容器。


小知识点:我们可以通过 spring.cloud.bootstrap.enabled=false 关闭 spring cloud bootstrap 上下文,但是如果将该配置配置在 application.properties 中卻无法生效,因为 bootstrap 加载优先级高于 application。所以配置未生效 bootstrap 已被加载。


  长按二维码关注,获取更多内容!


文章转载自花好夜猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论