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的专属配置类有如下几个特点:
- 该配置只能被Spring Cloud容器/Bootstrap引导上下文读取/加载
- 该配置的加载时机最早:优先于SB的普通配置、自动配置之前加载,所以它是具有最高优先级的配置类
- 该配置存在于父容器(SC容器)内,而非SB容器内
- 当然喽,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个):
context.getBeanFactory().getSingletonNames()(共34个):
看完了这个结果,相信你有个感官的认识了。那么A哥给小伙伴们提3个小问题哈,你可以自行思考:
- 为何一个是34,一个是22,这两个值为毛不等呢?差异在哪儿呢?
- SB容器为毛只是单单启动完,就有这么多Bean了呢?为何它如此重呢?
- SB应用有几个context上下文?SC应用呢?
总结
关于Spring Cloud系列的第一篇内容就写到这喽。本文先解释了为何我要写这个系列,以及简单的介绍了下Spring Cloud Context工程,通过本文你是能够大概清楚A哥后面将如何展开的,比如下文将是本系列的主菜之一:BootstrapApplicationListener监听器负责Spring Cloud容器的引导/启动/初始化,敬请关注。