Springcloud上下文

这是我参与更文挑战的第19天,活动详情查看:更文挑战

Spring cloud,相信大家已经耳熟能详了。Spring cloud 是一个基于 Spring boot 实现的云应用开发工具;Spring boot 专注于快速、方便集成的单个个体。

那么问题来了,Spring cloud 单体里的上下文是什么呢?

首先我们回忆下 Spring 的应用上下文,什么是应用上下文呢?可以简单的理解,就是将你需要 Spring 帮你管理的对象放入容器的那么一种容器对象。应用上下文即是Spring容器的一种抽象化表述,而我们常见的ApplicationContext 本质上说就是一个维护 Bean 定义以及对象之间协作关系的牛逼接口。Spring 的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的 BeanFactory,这是最简单的容器,只能提供基本的 DI 功能;还有一种就是继承了BeanFactory 后派生而来的应用上下文,其抽象接口也就是我们上面提到的ApplicationContext,它能提供更多企业级的服务,例如解析配置文件等,这也是应用上下文实例对象最常见的应用场景。有了上下文对象,我们就能向容器注册需要 Spring 管理的对象了。对于上下文抽象接口,Spring 也为我们提供了多种类型的容器实现,可在不同的应用场景选择:

  • AnnotationConfigApplicationContext: 从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式

  • ClassPathXmlApplicationContext: 从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式

  • XmlWebApplicationContext: 从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式

  • FileSystemXmlApplicationContext: 从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘中加载xml配置文件

  • AnnotationConfigWebApplicationContext: 专门为web应用准备的,适用于注解方式

这样,只需要将管理的对象(Spring 中我们都称为 bean)、bean 之间的协作关系配置好,通过应用上下文将配置加载到IOC容器,让Spring替我们管理对象,待我们需要使用对象的时候,再从容器中获取 bean 就可以了,因为容器能为你的程序提供你想要的对象管理服务了。

那么其实一个 Spring cloud 应用程序中有一个“引导上下文”的概念,这个引导上下文是主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。和主应用程序加载 application 中的属性不同,引导上下文加载 bootstrap 中的属性。配置在 bootstrap 中的属性有更高的优先级,因此默认情况下它们不能被本地配置覆盖。

如果想禁用引导过程,可设置 spring.cloud.bootstrap.enabled=false。

bootstrap 配置文件的应用场景:

  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息

  • 一些固定的不能被覆盖的属性

  • 一些加密/解密的场景

  • application 配置文件主要用于 Spring Boot 项目的自动化配置。