首页 > 其他分享 >spring启动流程

spring启动流程

时间:2024-08-10 14:28:16浏览次数:13  
标签:beanFactory spring 流程 启动 bean 线程 上下文

` public void refresh() throws BeansException, IllegalStateException {
this.startupShutdownLock.lock();
try {
// 启动关闭线程,这个线程用来表示启动当前容器使用的线程
// 该成员变量在之前的版本中并不存在,也是为了支持后续的并发实例化bean的情况
this.startupShutdownThread = Thread.currentThread();

		// StartupStep是个小工具,用来记录执行流程
		StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

		// 为当前上下文进行刷新前的准备
		prepareRefresh();

		// 此处是要初始化一个bean工厂,实时上beanFactory会在上下文构建的就创建了
		// 核心的目的是为了提供一种可以进行重复刷新的bean工厂的扩展,虽然我们不用
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// 为工厂做一些准备工作,完成一些核心的基础配置
		// 这是spring-framework需要做的工作
		prepareBeanFactory(beanFactory);

		try {
			// 空方法,留给子类去实现,GenericXmlApplicationContext没有进行扩展
			// GenericWebApplicationContext进行了扩展,注册了新的作用域,处理了和servlet相关的一些工作
			// 此处是spring提供给第三方的框架如spring-mvc等在容器启动前做的配置性工作
			postProcessBeanFactory(beanFactory);

			// 记录新的步骤,post-process
			StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");

			// 调用所有beanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的实现类,此时bean没有进行实例化
			// 我们可以在此处配置beanFactory,修改beanDefinition
			// 此处会处理BeanDefinitionRegistryPostProcessor
			// 执行流程会根据priorityOrdered  Ordered noOrdered进行排序
			// 单独添加了一个listener的探测器,会在bean实例化后判断是否是一个listener,如果是进行注册
			invokeBeanFactoryPostProcessors(beanFactory);

			// 注册beanPostProcessor,同样会根据priorityOrdered  Ordered noOrdered进行排序
			registerBeanPostProcessors(beanFactory);
			// 结束步骤
			beanPostProcess.end();

			// 初始化上下文的messageSource
			initMessageSource();

			// 初始化上下文的多播器
			initApplicationEventMulticaster();

			// 留出空方法,让子类扩展
			// ServletWebServerApplicationContext进行了扩展,创建一个webServer,启动tomcat
			onRefresh();

			// 注册监听器,此处listenerBean不会被实例化,会议beanName的方式注册
			// 还会处理一些早期事件
			registerListeners();

			// 核心:实例化所有的非懒加载的单例bean
			finishBeanFactoryInitialization(beanFactory);

			// 完成刷新,发布完成刷新的事件
			finishRefresh();
		}

		// 捕获运行时异常和错误
		catch (RuntimeException | Error ex ) {
			// 如果日志器支持警告级别,则记录异常信息
			if (logger.isWarnEnabled()) {
				logger.warn("Exception encountered during context initialization - " +
						"cancelling refresh attempt: " + ex);
			}
			// 销毁已创建的单例,以避免资源泄露
			destroyBeans();
			// 重置'active'标志
			cancelRefresh(ex);
			// 将异常抛给调用者
			throw ex;
		}
		// 无论是否抛出异常,都会执行的代码块,用于清理工作
		finally {
			contextRefresh.end(); // 结束上下文刷新过程
		}
	}
	// 无论是否抛出异常,都会执行的代码块,用于释放资源
	finally {
		this.startupShutdownThread = null; // 重置启动/关闭线程
		this.startupShutdownLock.unlock(); // 解锁启动/关闭锁
	}

}`

标签:beanFactory,spring,流程,启动,bean,线程,上下文
From: https://www.cnblogs.com/jichenghui/p/18352252

相关文章

  • springboot 博客交流平台-计算机毕业设计源码56406
    摘要博客交流平台作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、移动设备适配和跨平台体验、数据分析......
  • 初识Spring
    文章目录一.Spring是什么?1.为什么要学?2.学什么?3.怎么学?二.Spring相关概念1.初识Spring1.1.Spring家族1.2.了解Spring发展史2.Spring系统架构2.1.系统架构图2.2.课程学习路线3.Spring核心概念3.1.目前项目中的问题3.2.IOC、IOC容器、Bean、DI3.3.核心......
  • Spring全家桶(四):Spring 事务
    Spring声明式事务1. 声明式事务概念什么是事务事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败1.1编程式事务编程式事务是指手动编写程序来管理事务,即通过编写代码的方式直接控制事务的提交和回......
  • 基于SpringBoot+Vue的互联网违法行为举报平台设计和实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......
  • 基于SpringBoot的疗养院管理系统源码数据库
    摘 要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,疗养院管理系统的......
  • Spring源码系列六:AOP
    更多请关注:https://t.zsxq.com/fhroW文章目录ProxyFactory使用ProxyFactoryAdviceThrowsAdviceMethodInterceptorAdvisor通过spring产生代理对象TargetSourceSpringAop创建流程判断ProxyFactory使用JDK代理还是CGLIB代理拓展ProxyFactoryProxyFactory是Sprin......
  • Spring源码系列五:循环依赖
    更多请关注:https://t.zsxq.com/fhroW文章目录什么是循环依赖?解决思想spring如何解决循环依赖三级缓存补充什么是循环依赖?循环依赖是spring中的问题,普通的java项目不会有循环依赖。Spring中出现的循环依赖有三种情况:自我依赖、循环依赖、多组依赖什么是循环......
  • 【Java毕设选题推荐】基于SpringBoot的springbootJAVA的邮件过滤系统设计与实现
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......
  • 【Java毕设选题推荐】基于SpringBoot的O2O生鲜食品订购小程序
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......
  • Spring Boot集成Redis
    目录1.Redis简介2.添加依赖3.项目配置4.使用RedisStringTestSetTestListTestHashTestZSetTest5.测试结果1.Redis简介Redis是一款基于内存的使用K-V结构存取数据的NoSQL非关系型数据库。Redis的主要作用就是缓存数据,通常,会将关系型数据库(例如MySQL等)中的数据读......