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后提示值就是它的默认值 ...
随机推荐
- jmeter5.0 while controller使用总结
while controller 配合sql使用的方式 在while控制器条件中填空,这样当里面的请求断言失败后就会跳出循环 在while控制器条件中填LAST,当里面的请求断言失败后就会跳出循环,如 ...
- JavaEE正常开发怎么做
如果不使用第三方框架,用JavaEE的内容怎么去开发呢? 例如这里有一个需求: 最传统的方案如下:
- jdk7 并行计算框架Fork/Join
故名思义,拆分fork+合并join.jdk1.7整合Fork/Join,性能上有大大提升. 思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间.有点像,Map ...
- PL/SQL Developer连接本地Oracle 11g 64位数据库和快捷键设置
1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...
- 2、JPA-Annotation
注解放在类属性上不生效时可放在get方法上试试,原因未知 @Entity /** * @Entity 该Java类为实体类,将映射到数据库表.如声明一个实体类 Customer,它将映射到数据库中的 ...
- Linux记录-shell实现脚本监控服务器及web应用
1.apache web 服务器 1 2 3 4 5 6 7 8 9 10 !/bin/bash # 表示请求链接3秒钟,不要返回的测试数据 nc -w 3 localhost 80 &> ...
- BFC规范
BFC规范 BFC规范是什么? BFC规范也叫块级格式化上下文.是指一个独立的容器. 如何触发BFC? 我们可以通过一下几种方式触发BFC 1.通过浮动触发:float(除none) 2.通过绝对\固 ...
- Markdown Cheatsheet
This is intended as a quick reference and showcase. For more complete info, see John Gruber's origin ...
- transitionEnd不起作用解决方法
var show = function(html, className) { className = className || ""; var mask = $("< ...
- MVC异步AJAX的三种方法(JQuery的Get方法、JQuery的Post方法和微软自带的异步方法)
异步是我们在网站开发过程中必不可少的方法,MVC框架的异步方法也有很多,这里介绍三种方法: 一.JQuery的Get方法 view @{ Layout = null; } <!DOCTYPE h ...