springcloud情操陶冶-bootstrapContext(三)
本文则将重点阐述context板块的自动配置类,观察其相关的特性并作相应的总结
自动配置类
直接查看cloudcontext板块下的spring.factories对应的EnableAutoConfiguration键值对
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfiguration
除了第一个自动配置类在前文有所提及,其余的四个可以分为步骤来进行一一的解析
MVC生命周期端点自动配置类-刷新属性
管理MVC的整个生命周期而暴露给外部的端点,LifecycleMvcEndpointAutoConfiguration的内部源码还是很简单的
// 排在MVC配置类之后
@Configuration
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class LifecycleMvcEndpointAutoConfiguration {
// 注册环境管理器EnvironmentManager
@Bean
@ConditionalOnMissingBean
public EnvironmentManager environmentManager(ConfigurableEnvironment environment) {
return new EnvironmentManager(environment);
}
}
EnvironmentManager类内含上下文环境变量ConfigurableEnvironment和事件分发器publisher,同时内部也暴露了JMX接口供外部调用。
总的来说也就是通过该类变更上下文属性便会触发EnvironmentChangeEvent事件,其中变更的属性都将存入名为manager的属性集合中
刷新自动配置类-刷新Bean
此处的刷新与前者的刷新属性不同,其针对的是bean。并通过相应的刷新操作触发RefreshScopeRefreshedEvent事件
@Configuration
@ConditionalOnClass(RefreshScope.class)
// 可通过更改spring.cloud.refresh.enabled值来确定是否让该配置生效。默认为true
@ConditionalOnProperty(name = RefreshAutoConfiguration.REFRESH_SCOPE_ENABLED, matchIfMissing = true)
@AutoConfigureBefore(HibernateJpaAutoConfiguration.class)
public class RefreshAutoConfiguration {
// 主要bean类
@Bean
@ConditionalOnMissingBean(RefreshScope.class)
public static RefreshScope refreshScope() {
return new RefreshScope();
}
}
其余的代码没贴出来,因为发现关键类就是此RefreshScope,其也暴露了JMX接口供外部调用来刷新bean(销毁指定的bean)
刷新端点自动配置类-刷新context
此处的刷新针对的不是bean对象了,而是整个上下文context。
@Configuration
@ConditionalOnClass({EndpointAutoConfiguration.class, Health.class})
// 排在前者配置之后
@AutoConfigureAfter({ LifecycleMvcEndpointAutoConfiguration.class,
RefreshAutoConfiguration.class})
// 导入类
@Import({ RestartEndpointWithIntegrationConfiguration.class,
RestartEndpointWithoutIntegrationConfiguration.class,
PauseResumeEndpointsConfiguration.class })
public class RefreshEndpointAutoConfiguration {
}
优先对导入类作简单的查看把
1.前两个类其实都是为了创建RestartEndpoint对象
// 端点名为restart
@Bean
@ConditionalOnEnabledEndpoint
@ConditionalOnMissingBean
public RestartEndpoint restartEndpointWithoutIntegration() {
return new RestartEndpoint();
}
而RestartEndpoint端点也暴露了JMX接口供外界调用直接刷新context,但无事件触发,且其头上有一个注解
@Endpoint(id = "restart", enableByDefault = false)
public class RestartEndpoint implements ApplicationListener<ApplicationPreparedEvent> {
}
可通过配置management.endpoint.${id}.enabled属性来开关指定的端点,
也可以通过@Endpoint注解中的属性enableByDefault来指定(默认为true);
全局的话也可通过环境属性management.endpoints.enabled-by-default来指定。
由此得知RestartEndPoint端点默认是不开启的
不过笔者发现此端点是ApplicationListener接口的实现类,但据笔者的认知范围,只有在spring.factories文件中定义才会被spring调用,那其又是怎么被调用,确保其内部的context是有值的呢?待商榷!
2.PauseEndpoint端点和ResumeEndpoint端点的使用,但彼此都依赖RestartEndPoint端点,均是它的内部类。
@Configuration
class PauseResumeEndpointsConfiguration {
// 端点名为pause
@Bean
@ConditionalOnBean(RestartEndpoint.class)
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public RestartEndpoint.PauseEndpoint pauseEndpoint(RestartEndpoint restartEndpoint) {
return restartEndpoint.getPauseEndpoint();
}
// 端点名为resume
@Bean
@ConditionalOnBean(RestartEndpoint.class)
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public RestartEndpoint.ResumeEndpoint resumeEndpoint(
RestartEndpoint restartEndpoint) {
return restartEndpoint.getResumeEndpoint();
}
}
通过这两个端点来控制上下文的启动与关闭,于是官方也暴露了相应的JMX接口供外部调用
然后对内部的Bean作下简单的介绍
// 健康检查类
// 可通过management.health.${id}.enable属性来控制
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledHealthIndicator("refresh")
RefreshScopeHealthIndicator refreshScopeHealthIndicator(ObjectProvider<RefreshScope> scope,
ConfigurationPropertiesRebinder rebinder) {
return new RefreshScopeHealthIndicator(scope, rebinder);
}
可写环境端点自动配置类
对环境变量的属性可更改的端点则通过WritableEnvironmentEndpointAutoConfiguration来实现
@Configuration
@ConditionalOnClass({ EnvironmentEndpoint.class, EnvironmentEndpointProperties.class })
@ConditionalOnBean(EnvironmentManager.class)
@AutoConfigureBefore(EnvironmentEndpointAutoConfiguration.class)
@AutoConfigureAfter(LifecycleMvcEndpointAutoConfiguration.class)
@EnableConfigurationProperties({ EnvironmentEndpointProperties.class })
// 可通过management.endpoint.env.post.enabled属性开关,默认为true
@ConditionalOnProperty(value = "management.endpoint.env.post.enabled", matchIfMissing = true)
public class WritableEnvironmentEndpointAutoConfiguration {
}
内部的Bean对象也就是暴露属性的更改权限,有JMX方式也有MVC方式。
JMX方式
// 端点名为env
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public WritableEnvironmentEndpoint environmentEndpoint(Environment environment) {
WritableEnvironmentEndpoint endpoint = new WritableEnvironmentEndpoint(environment);
String[] keysToSanitize = this.properties.getKeysToSanitize();
if (keysToSanitize != null) {
endpoint.setKeysToSanitize(keysToSanitize);
}
return endpoint;
}
MVC方式则引用了上文提到的EnvironmentManager对象。并且也引用了JMX方式中的WritableEnvironmentEndpoint对象,具体的使用则属于cloud-actuator板块,有兴趣的读者可自行分析
// 该端点以/env作为端点入口
@Bean
@ConditionalOnEnabledEndpoint
public WritableEnvironmentEndpointWebExtension environmentEndpointWebExtension(
WritableEnvironmentEndpoint endpoint, EnvironmentManager environment) {
// 调用EnvironmentManager对象来操作上下文的环境变量
return new WritableEnvironmentEndpointWebExtension(endpoint, environment);
}
不管是哪种方式的调用,作用的对象是属性。包含了单个属性的更改、某个Environment的变量集合查看等等,范围更为宽广。
小结
cloudcontext板块提供了针对环境属性、bean对象、上下文等方式的刷新操作,均暴露JMX方式供外界调用;至于MVC方式有兴趣的读者可自行分析。
也就是刷新的入口在context板块中已经得到了相应的补充,至于扩展与相应的使用便是其余cloud板块的范畴了。明白此点比较有利于后续对cloud的深入了解
springcloud情操陶冶-bootstrapContext(三)的更多相关文章
- springcloud情操陶冶-bootstrapContext(二)
承接前文监听器对bootstrapContext创建的引导,笔者了解到其主要入口类为BootstrapImportSelectorConfiguration.本文将基于此类进行简单的分析 Bootst ...
- springcloud情操陶冶-bootstrapContext(一)
基于前文对springcloud的引导,本文则从源码角度查阅下cloud的context板块的运行逻辑 前言 springcloud是基于springboot开发的,所以读者在阅读此文前最好已经了解了 ...
- springcloud情操陶冶-springcloud config server(三)
承接前文springcloud情操陶冶-springcloud config server(二),本文就不讲述server了,就简单阐述下client的应用 前话 config server在引入的时 ...
- springcloud情操陶冶-springcloud config server(一)
承接前文springcloud情操陶冶-springcloud context(二),本文将在前文基础上浅析下ConfigServer的工作原理 前话 根据前文得知,bootstrapContext引 ...
- springcloud情操陶冶-springcloud config server(二)
承接前文springcloud情操陶冶-springcloud config server(一),本文将在前文的基础上讲解config server的涉外接口 前话 通过前文笔者得知,cloud co ...
- springcloud情操陶冶-初识springcloud
许久之前便听到了springcloud如雷贯耳的大名,但是不曾谋面,其主要应用于微服务的相关架构.笔者对微服务并不是很了解,但其既然比较出众,遂也稍微接触研究下 springcloud特性 sprin ...
- springboot情操陶冶-web配置(三)
承接前文springboot情操陶冶-web配置(二),本文将在前文的基础上分析下mvc的相关应用 MVC简单例子 直接编写一个Controller层的代码,返回格式为json package com ...
- Spring源码情操陶冶-AOP之Advice通知类解析与使用
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...
- Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory 前文提到最关键的地方是解析bea ...
随机推荐
- BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心
BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心 题意: 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返 ...
- BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...
- 猴子 JDFZ模拟赛
猴子(弱) Description 话说NP做梦,梦见自己变成了一只猴子,并且有很多香蕉树,这些香蕉树都种在同一直线上,而NP则在这排香蕉树的第一棵树上.NP当然想吃尽量多的香蕉,但它又不想在地上走, ...
- Selenium在定位的class含有空格的复合类的解决办法整理
1.class属性唯一但是有空格,选择空格两边唯一的哪一个 <div id="tempConfigTable" class="dtb-style-1 table-d ...
- VMware workstation创建虚拟机console图文
1. 概述2. 配置入口3. 新建虚拟机向导3.1 类型配置3.2 硬件兼容性3.3 操作系统安装3.4 客户机操作系统类型3.5 客户机的名称位置4. 客户机硬件配置选择4.1 客户机处理器配置4. ...
- HTML5仿微信聊天界面、微信朋友圈实例
这几天使用H5开发了一个仿微信聊天前端界面,尤其微信底部编辑器那块处理的很好,使用HTML5来开发,虽说功能效果并没有微信那么全,但是也相当不错了,可以发送消息.表情,发送的消息自动回滚定位到底部,另 ...
- 记一次产品需求:图片等比缩放和CSS自适应布局16:9
前言 前阵子,产品跑过来问我现有的模板中没有图片模板,需要添加一个图片模板:然而,他要求图片在展示区最好能够实现随着窗口的变化而自动按图片比例等比缩放,并且居中展示图片.我当时想着,抛开技术实现层面, ...
- ToB蓝海的台阶-PaaS,SaaS技术详解
前言 随着大量SaaS公司进入市场,我们看到颠覆性的软件服务以各种方式进入企业流程-从营销工具到支付系统.随着SaaS帮助优化业务流程,实现更流畅和自动化的运营,风险投资公司首先潜入池中寻找最优秀和最 ...
- Java中ArrayList学习笔记
1. 先看两段代码 这段代码在执行的时候会报 但是这样写就好着呢: 总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个 ...
- 【STM32H7教程】第6章 STM32H7工程模板建立(IAR8)
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第6章 STM32H7工程模板建立(IAR8) 本章 ...