Spring Boot默认Initializer(1)——ConfigurationWarningsApplicationContextInitializer
ConfigurationWarningsApplicationContextInitializer的作用是用来报告Spring容器的一些常见的错误配置的。这个类中定义了两个内部类:
1. 定义了一个Check接口及它的实现类ComponentScanPackageCheck(以静态内部类形式定义)
2. 定义了一个BeanDefinitionRegistryPostProcessor接口的实现类(以静态内部类形式定义)
因此我把这两个内部类理解成ConfigurationWarningsApplicationContextInitializer的组合成员,类图附在最后,
initialize()方法,获取Check的实例,然后构建出一个ConfigurationWarningsPostProcessor实例,注册到Sring的容器中
public void initialize(ConfigurableApplicationContext context) {
context.addBeanFactoryPostProcessor(
new ConfigurationWarningsPostProcessor(getChecks()));
}
ConfigurationWarningsPostProcessor是BeanDefinitionRegistryPostProcessor接口的实现类,而BeanDefinitionRegistryPostProcessor接口又继承于BeanFactoryPostProcessor接口,下面依次了解下这几个Spring的接口和类图:

BeanFactoryPostProcessor接口:允许对spring容器的bean definition进行自定义的修改,可改变容器底层管理的bean的属性值。Spring容器会自动检测容器的bean definition中有没实现了BeanFactoryPostProcessor接口的Bean ,如果有话将会在创建其他Bean之前首先执行该接口的代码。
BeanDefinitionRegistryPostProcessor接口:对BeanFactoryPostProcessor接口的一个扩展,允许在Spring容器会自动检测容器的bean definition之前,进一步的注册bean definiton到容器中。特定情况下还可以通过进一步的注册bean definiton而反过来定义BeanFactoryPostProcessor接口的实例
BeanDefinitionRegistry接口:作用主要是向注册表中注册 BeanDefinition 实例
搞清楚相关接口的用意后,我们看一下 ConfigurationWarningsPostProcessor 实现BeanDefinitionRegistryPostProcessor接口和BeanFactoryPostProcessor接口做了哪些事情,主要是看两个方法:
//这是实现BeanFactoryPostProcessor接口的方法,没做任何事
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
} //这个是实现BeanDefinitionRegistryPostProcessor接口的方法,主要是把在注册BeanDefinition实例过程中产生的告警信息传给Check接口的实例进行处理产生要告警的内容,没进行告警输出
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
for (Check check : this.checks) {
String message = check.getWarning(registry);
if (StringUtils.hasLength(message)) {
warn(message); //通过日志打印出告警信息
}
} }
由此可见 ConfigurationWarningsPostProcessor 的主要作用就是把在注册BeanDefinition实例过程中产生的告警信息传给Check接口的实例进行处理,ConfigurationWarningsApplicationContextInitializer中只提供了一个Check的实现 ComponentScanPackageCheck,简单分析下 ComponentScanPackageCheck类的源码:
//这个方法是实现了Check接口的接口方法
public String getWarning(BeanDefinitionRegistry registry) {
Set<String> scannedPackages = getComponentScanningPackages(registry);
List<String> problematicPackages = getProblematicPackages(scannedPackages); //获取有在扫描包范围内的有警告的包
if (problematicPackages.isEmpty()) {
return null;
}
return "Your ApplicationContext is unlikely to "
+ "start due to a @ComponentScan of "
+ StringUtils.collectionToDelimitedString(problematicPackages, ", ")
+ ".";
}
//获取Spring容器要扫描的包
protected Set<String> getComponentScanningPackages(
BeanDefinitionRegistry registry) {
Set<String> packages = new LinkedHashSet<String>();
String[] names = registry.getBeanDefinitionNames();
for (String name : names) {
BeanDefinition definition = registry.getBeanDefinition(name);
if (definition instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition annotatedDefinition = (AnnotatedBeanDefinition) definition;
addComponentScanningPackages(packages,
annotatedDefinition.getMetadata()); //从每个definition中获取要扫描的包,并加入到packages集合中
}
}
return packages;
}
以下是打印告警信息的方法,这个方法 还是位于 ConfigurationWarningsPostProcessor 类中,这个方法会由Spring容器在检测处理BeanFactoryPostProcessor接口的bean definition时触发并执行:
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
for (Check check : this.checks) {
String message = check.getWarning(registry);
if (StringUtils.hasLength(message)) {
warn(message);
}
} }

Spring Boot默认Initializer(1)——ConfigurationWarningsApplicationContextInitializer的更多相关文章
- Spring Boot默认的JSON解析框架设置
方案一:启动类继承WebMvcConfigurerAdapter,覆盖方法configureMessageConverters ... @SpringBootApplication public cl ...
- spring boot默认访问静态资源
演示spring boot默认可以直接访问静态资源的2种方法: 第一种:在src/main/resources资源目录下创建一个名为"static"的文件夹(该文件夹的名称是规定死 ...
- Spring boot 默认静态资源路径与手动配置访问路径的方法
这篇文章主要介绍了Spring boot 默认静态资源路径与手动配置访问路径的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在application.propertis中配置 ##端口号 ...
- Spring Boot 默认指标从哪来?
了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标? 如果没有 - 您可以将 actuator ...
- Spring Boot默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- Spring Boot 默认的指标数据从哪来的?
了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标?如果没有 - 您可以将 actuator ...
- 20. Spring Boot 默认、自定义数据源 、配置多个数据源 jdbcTemplate操作DB
Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了hikari,这里主要研究下hikari的默认配置 0. 创建Spring Boot项目,选中 ...
- 修改Spring Boot默认的上下文
前言 默认情况下,Spring Boot使用的服务上下文为"/",我们可以通过"http://localhost:PORT/" 直接诶访问应用: 但是在生产环境 ...
- 【杂谈】Spring Boot 默认支持的并发量
Spring Boot应用支持的最大并发量是多少? Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改.当在配置文件中敲出max后提示值就是它的默认值 ...
随机推荐
- kubernetes 基础一
从集群外部访问pod或service pod 在Kubernetes中,创建.调度和管理的最小单位是pod而不是容器.pod代表着一个运行着的工作单元.一般情况下,每个pod中只有一个容器(原因是为了 ...
- Linux系统IO分析工具之iotop常用参数介绍
Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...
- Elasticsearch分片优化
原文地址:https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index 大多数ElasticSearch用户在创建索引 ...
- 【1】【leetcode-127】单词接龙word-ladder
(不会,经典广度优先搜索) 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改 ...
- IP简介(一)
1. OSI模型 TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层: IP是TCP/IP的第二层互联层,对应OSI的第三层网络层. TCP属于OSI中的运输层它是面向连接的协议: IP属于 ...
- 打印流PrintStream
打印流PrintStream PrintStream extends OutputStream 1.打印流的特点 只负责数据的输出,不负责数据的读取 与其他的流不同,打印流永远不会抛出IOExcept ...
- VM克隆后找不到eth0的问题解决
问题描述 使用VM WorkStation新建虚拟机A,查看IP信息,显示结果: [root@centos65x64 ~]# ifconfig -a eth0 Link encap:Ethernet ...
- Windows 操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 二十二、Linux 进程与信号---进程创建
22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...
- 【python小练】0005
第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. 首先,iphone5的分辨率是1136x640. if条件句判断横(纵)向是否大于对应的ipho ...