一、为何我决定写Spring Cloud专栏(下)

简介: 一、为何我决定写Spring Cloud专栏(下)

Spring Cloud专属配置类


也叫Bootstrap引导容器的专属配置类。通过上面3步的第一步解释可知:Spring Cloud它并不会去执行/加载你配置的EnableAutoConfiguration自动配置类,那么如果SC它在引导期间需要属于自己的配置怎么办呢???


这就到了SC它专为自己开发出来的一套配置机制,姑且把它叫做Spring Cloud专属配置类。不同于Spring Boot自动配置使用的是org.springframework.boot.autoconfigure.EnableAutoConfiguration,它作为SC专属的,自然key也就不能一样喽,使用的是:org.springframework.cloud.bootstrap.BootstrapConfiguration(@BootstrapConfiguration注解的全类名)。通过这个key配置的配置类们(可以是普通配置类,也可以是自动配置类),就是只能被SC容器在启动时加载的专属配置类,是SC父容器专属。


SB的自动配置类使用AutoConfigurationImportSelector负载最后加载,此处SC的专属配置类使用的是BootstrapImportSelector负责加载,它俩的共同点是:都是一个DeferredImportSelector,所以执行时机是最晚的


通过以上的了解,我们可以知道,SC的专属配置类有如下几个特点:


  1. 该配置只能被Spring Cloud容器/Bootstrap引导上下文读取/加载
  2. 该配置的加载时机最早:优先于SB的普通配置、自动配置之前加载,所以它是具有最高优先级的配置类
  3. 该配置存在于父容器(SC容器)内,而非SB容器内
  4. 当然喽,SB容器也可以访问


Spring Boot容器 vs Spring Cloud容器


我们知道,Spring Cloud容器是Spring Boot容器的父容器。为了让你更直观的看到父子容器内的Bean情况(个数 + 详情),了解其区别,此处A哥写个最简案例比较一波:


public static void main(String[] args) {
    ConfigurableApplicationContext bootContext = SpringApplication.run(Application.class, args);
    System.out.println("boot容器类型" + bootContext.getClass());
    System.out.println("boot容器Bean定义总数:" + bootContext.getBeanFactory().getBeanDefinitionCount());
    System.out.println("boot容器Bean实例总数:" + bootContext.getBeanFactory().getSingletonCount());
    ConfigurableApplicationContext cloudContext = (ConfigurableApplicationContext) bootContext.getParent();
    System.out.println("cloud容器类型" + cloudContext.getClass());
    System.out.println("cloud容器Bean定义总数:" + cloudContext.getBeanFactory().getBeanDefinitionCount());
    System.out.println("cloud容器Bean实例总数:" + cloudContext.getBeanFactory().getSingletonCount());
}


控制台输出:


boot容器类型class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
boot容器Bean定义总数:272
boot容器Bean实例总数:283
cloud容器类型class org.springframework.context.annotation.AnnotationConfigApplicationContext
cloud容器Bean定义总数:22
cloud容器Bean实例总数:34


SC容器(父容器)里的“内容”是远远少于SB容器(子容器的)。由于父容器里内容较少,可以详细看看。A哥这里帮你截图让你更直观的感受一把喽:


context.getBeanFactory().getBeanDefinitionNames()(共22个):


image.png


context.getBeanFactory().getSingletonNames()(共34个):


image.png


看完了这个结果,相信你有个感官的认识了。那么A哥给小伙伴们提3个小问题哈,你可以自行思考:


  1. 为何一个是34,一个是22,这两个值为毛不等呢?差异在哪儿呢?
  2. SB容器为毛只是单单启动完,就有这么多Bean了呢?为何它如此重呢?
  3. SB应用有几个context上下文?SC应用呢?


总结



关于Spring Cloud系列的第一篇内容就写到这喽。本文先解释了为何我要写这个系列,以及简单的介绍了下Spring Cloud Context工程,通过本文你是能够大概清楚A哥后面将如何展开的,比如下文将是本系列的主菜之一:BootstrapApplicationListener监听器负责Spring Cloud容器的引导/启动/初始化,敬请关注。

相关文章
|
3月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
3月前
|
Java 开发工具 git
实现基于Spring Cloud的配置中心
实现基于Spring Cloud的配置中心
|
3月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14659 24
|
3月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
327 15
|
3月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
68 3
|
3月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
152 5
|
3月前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
3月前
|
存储 安全 Java
实现基于Spring Cloud的分布式配置管理
实现基于Spring Cloud的分布式配置管理
下一篇
无影云桌面