springboot源码流程解析
2021-10-30 09:59:17 32 举报
AI智能生成
登录查看完整内容
springboot源码流程解析
作者其他创作
大纲/内容
springboot 2.3.0
1.启动流程
span style=\"font-size: inherit;\
this.resourceLoader = resourceLoader;
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
REACTIVE
NONE
SERVLET
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
getSpringFactoriesInstances(ApplicationContextInitializer.class,new Class<?>[] {})
getClassLoader()
(List)loadSpringFactories(classLoader)
setInitializers--this.initializers = new ArrayList<>(initializers)
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); --this.listeners = new ArrayList<>(listeners);
this.mainApplicationClass = deduceMainApplicationClass();
#run(args)
ConfigurableApplicationContext context = null
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>()
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting()
RestartApplicationListener#onApplicationStartingEvent
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args)
configureIgnoreBeanInfo(environment);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
若没有显示指定容器的类型,则根据this.webApplicationType创建class
若为SERVLET,创建AnnotationConfigServletWebServerApplicationContext,反射实例化
context.setEnvironment(environment)
postProcessApplicationContext(context);
applyInitializers(context);
循环依次initializer.initialize(context)
listeners.contextPrepared(context);
beanFactory.registerSingleton(\"springApplicationArguments\
若this.lazyInitialization:默认false,可在yaml配置main:lazy-initialization:truecontext.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor())
Set<Object> sources = getAllSources();
listeners.contextLoaded(context);
refreshContext(context);
refresh((ApplicationContext) context);
大部分与普通springioc容器流程相同,详情见springioc流程分析
不同点
#invokeBeanFactoryPostProcessors
ServletWebServerApplicationContext#Onfresh
this.themeSource = UiApplicationContextUtils.initThemeSource(this);
createWebServer()
ServletWebServerFactory factory = getWebServerFactory();
this.webServer = factory.getWebServer(getSelfInitializer());
getSelfInitializer()--return this::selfInitialize: 传入方法引用,匿名函数,在之后webServer初始化时调用>>>>selfInitialize(ServletContext servletContext)
prepareWebApplicationContext(servletContext);
Object rootContext = servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
setServletContext(servletContext);
registerApplicationScope(servletContext);
ServletContextScope appScope = new ServletContextScope(servletContext);
for (ServletContextInitializer beans : getServletContextInitializerBeans())>>beans.onStartup(servletContext);
getServletContextInitializerBeans()--return new ServletContextInitializerBeans(getBeanFactory());----addServletContextInitializerBeans(beanFactory);----addAdaptableBeans(beanFactory);
getWebServer(ServletContextInitializer... initializers)
Tomcat tomcat = new Tomcat();
TomcatEmbeddedContext context = new TomcatEmbeddedContext();
addDefaultServlet(context);
TomcatStarter starter = new TomcatStarter(initializers);
for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) { customizer.customize(context);\t\t}
postProcessContext(context);
getBeanFactory().registerSingleton(\"webServerGracefulShutdown\
getBeanFactory().registerSingleton(\"webServerStartStop\
sources.replace(\"servletContextInitParams\
sources.replace(\"servletConfigInitParams\
#registerListeners
详情见springioc流程分析
#finishRefresh
getLifecycleProcessor().onRefresh();
DefaultLifecycleProcessor#startBeans(true);
webServerStartStop#start
this.webServer.start();
this.running = true;
webServerGracefulShutdown
根据各个bean不同的应用阶段分组
调用LifecycleGroup中的所有Lifecycle的start方法
this.webServer.start()
context.registerShutdownHook();
listeners.started(context);
List<Object> runners = new ArrayList<>();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
listeners.running(context);
2.@SpringBootApplication
@SpringBootConfiguration
@Configuration
@Component
说明Spring的配置类也是Spring的一个组件
AutoConfigurationExcludeFilter
TypeExcludeFilter
@EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class)自动注册包---主配置类所在的包:com.kuang.demo包
#registerBeanDefinitions
@Import(AutoConfigurationImportSelector.class)自动导入包的核心
#selectImports(AnnotationMetadata annotationMetadata)
#isEnabled(AnnotationMetadata metadata)
#getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
导入的类:自动导入选择器AutoConfigurationImportSelector
类里有个方法:getAutoConfigurationEntry作用:获得自动配置实体
该方法里调用了方法:getCandidateConfigurations目的:获取候选的配置
getSpringFactoriesLoaderFactoryClass()return EnableAutoConfiguration.class;获取标注了EnableAutoConfiguration这个注解的类:包括主启动类public class Application
应用
自定义运行监听器
implements SpringApplicationRunListenerextends EventPublishingRunListener
写入factories中
插手ServletContext初始化工作
implements ServletContextInitializer
自定义配置嵌入式Servlet容器
implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>
mvc自定义配置
implements WebMvcConfigurer
自定义事件
extends ApplicationEvent
ApplicationContext.publishEvent(“”)
自定义事件监听器
容器事件
implements ApplicationListener<ApplicationEvent>
implements GenericApplicationListener
要想从容器创建开始就监听所有事件,在spring.factories配置key=org.springframework.context.ApplicationListener
请求事件
extends RequestContextListener
插手容器启动时提供参数
implements ApplicationRunner
implements CommandLineRunner
3.ApplicationContextInitializer(系统初始化器
1.ApplicationContextInitializer 介绍
新建一个类 MyApplicationContextInitializer 并实现 ApplicationContextInitializer 接口
SpringBoot的main方法application.addInitializers
application.properties配置
SpringBoot的SPI扩展---META-INF/spring.factories中配置
4.监听器Listenter
SpringBoot框架事件
图片
获取监听器列表
触发机制
自定监听器
5.Bean的创建
6.Banner解析
7.计时器
StopWatch用来统计任务的耗时
8.启动类加载器
9.Spring Boot starter介绍以及自定义starter
1.starter介绍
2.自定义starter
pom文件添加spring-boot-autoconfigure和spring-boot-configuration-processor
创建PriceAutoConfiguration。增加注解EnableConfigurationProperties, ConditionalOnProperty
spring.factories中添加自动配置类实现
3.源码解析
我们引入starter的依赖,会将自动配置的类的jar引入。@SpringBootApplication的注解中有一个是@EnableAutoConfiguration注解,这个注解有一个@Import({EnableAutoConfigurationImportSelector.class}),EnableAutoConfigurationImportSelector内部则是使用了SpringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包。 启动类上@SpringBootApplication - 引入AutoConfigurationImportSelector - ConfigurationClassParser 中处理 - 获取spring.factories中EnableAutoConfiguration实现
原理
4.webflux解析
WebFlux请求处理流程
0 条评论
回复 删除
下一页