java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Refresh流程说明

SpringBoot之Refresh流程的简单说明

作者:之诚

这篇文章主要介绍了SpringBoot之Refresh流程的简单说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

启动入口

在这里插入图片描述

Springboot 程序的启动入口是一个main方法,从这个入口方法一路追溯下去,最终可以找到Refresh方法的。

追溯流程如下:

org.springframework.boot.SpringApplication#run(java.lang.Class<?>, java.lang.String...)
org.springframework.boot.SpringApplication#run(java.lang.Class<?>[], java.lang.String[])
org.springframework.boot.SpringApplication#run(java.lang.String...)
org.springframework.boot.SpringApplication#refreshContext
org.springframework.boot.SpringApplication#refresh(org.springframework.context.ConfigurableApplicationContext)
org.springframework.context.ConfigurableApplicationContext#refresh

上面的几个方法就是从main到refresh方法的路径,中间省略了一两个方法。用心找下就能追溯到refresh。

查看源码的时候一定要抓住主路径,放弃次要路径,因为Spring框架台复杂庞大了,不可能弄清楚所有的细节的。

Refresh方法

最终追溯到的refresh方法也是 ConfigurableApplicationContext 接口的方法, 这个接口有三个很重要的实现类, 我们先看下 AbstractApplicationContext 类中的refresh方法。

在这里插入图片描述

图中是否有一种熟悉的感觉, 这个方法就是众多的讲Spring的博客文章都必定会说到的方法, 里面的每个步骤都是很重要的。

这里会先检查容器中用户有没有实现自己的事件监听器,如果有的话就使用用户自定义的, 如果没有就使用Spring自带的简单的事件监听器SimpleApplicationEventMulticaster。

这里监听器会 registerSingleton方法简单的注册到容器AbstractApplicationContext实现 ApplicationEventPublisher接口(中间继承间隔好几层),而这个接口就有发布时间的方法。

所以一般的容器都有发布事件的能力。发布事件的逻辑是, publishEvent方法内部调用SimpleApplicationEventMulticaster的* onApplicationEvent方法, 这个方法内部会先从容器中获取所有的事件监听器Bean,并放入缓存中。

然后在根据事件的类型选择正确的事件处理器来处理, 这里会使用线程池来处理

在第五步的invokeBeanFactoryPostProcessors方法中, 除了会调BeanFactoryPostProcessors的实现类方法外还会调调用BeanDefinitionRegistryPostProcessor 类的postProcessBeanDefinitionRegistry方法,很多的框架就是通过这个方法来注入自己的bean, 比如Mybatis的 org.mybatis.spring.mapper.MapperScannerConfigurer 类。

总结

Refresh 是Spring启动的重要方法, Spring的启动整个周期都在这个方法中有提现,上面的描述只是我自己的理解,不一定准确完善。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文