首页 > 其他分享 >【SpringBoot】一张图看懂初始化阶段-refreshContext

【SpringBoot】一张图看懂初始化阶段-refreshContext

时间:2024-10-27 20:51:26浏览次数:9  
标签:初始化 SpringBoot beanFactory refreshContext 子类 bean 图看 ex 上下文

springboot的启动分为两部分,一部分是注解,一部分是SpringApplication.run(Springboot.class, args),那么我们的注解又是如何嵌入到程序中呢?靠的就是refreshContext方法,同理,我们跟踪源码进入refreshContext方法

@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			//准备这个上下文来刷新。
            //记录启动时间、状态,web容器初始化其property,复制listener
			prepareRefresh();

			// 告诉子类刷新内部bean工厂。
            //这里返回的是context的BeanFactory
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
           
            //beanFactory注入一些标准组件,例如ApplicationContextAwareProcessor,ClassLoader等
			//  准备bean在此上下文中使用。
			prepareBeanFactory(beanFactory);

			try {
				//  允许在上下文子类中对bean工厂进行后处理。
                //给实现类留的一个钩子,例如注入BeanPostProcessors,这里是个空方法
				postProcessBeanFactory(beanFactory);

				//  调用在上下文中注册为bean的工厂处理器。
				invokeBeanFactoryPostProcessors(beanFactory);

				//  注册拦截bean创建的bean处理器。
				registerBeanPostProcessors(beanFactory);

				//  初始化此上下文的消息源。
				initMessageSource();

				//  为此上下文初始化事件多播。
				initApplicationEventMulticaster();

				//  在特定的上下文子类中初始化其他特殊bean。
				onRefresh();

				//  检查侦听器bean并注册它们。
				registerListeners();

				//  实例化所有剩余的(非拉齐-init)单例。
				finishBeanFactoryInitialization(beanFactory);

				//  最后一步:发布相应事件.
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				//  销毁已经创建的单例以避免悬空资源。
				destroyBeans();

				//  重置“actiove”标志。
				cancelRefresh(ex);

				// 向调用者传播异常。
				throw ex;
			}

			finally {
				//  重置Spring核心中常见的内省缓存,因为我们可能不再需要单例bean的元数据了。。。
				resetCommonCaches();
			}
		}
	}

到这里,就可以看到一系列bean的操作,继续跟踪进入invokeBeanFactoryPostProcessors(调用在上下文中注册为bean的工厂处理器)方法

 

进入ConfigurationClassParser这个类后,方法调用也是挺绕的,这里就不深究了…进入这个类主要是想看下它的一些方法,因为对于springboot注解的引用就是在这个类进行的,比如doProcessConfigurationClass: 

标签:初始化,SpringBoot,beanFactory,refreshContext,子类,bean,图看,ex,上下文
From: https://blog.csdn.net/zhyooo123/article/details/143225517

相关文章

  • Springboot 自动配置原理
    1.在SpringBoot项目中的引导类上有一个复合注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:@SpringBootConfiguration 用于定义Bean和配置Spring容器。@EnableAutoConfiguration 实现自动化配置的核心注解@ComponentScan 扫描包里的组件2.其中......
  • springboot使用ai
    springboot下载ai的pom比如:想使用本地ollama(报错:依赖找不到)解决:<!--因为maven暂时下载不了SpringAIOllama依赖,引用Spring快照依赖包--><repositories><repository><id>central</id><url>https://repo.maven.apache.org......
  • SpringBoot整合API接口做快递智能识别
    目录第一步阿里云订阅快递服务第二步整合springBoot将接口调通原有的代码改造后的代码第三步对接前端进行渲染效果后台 controller servie serviceImpl前台template部分script部分style部分最终效果第一步阿里云订阅快递服务登录以后点击云市场找到对应......
  • [笔记] SpringBoot3 使用 EasyExcel 封装工具类实现 自定义表头 导出并实现 数据格式
    在现代企业应用中,数据导出功能是非常常见的需求。特别是在处理大量数据时,将数据导出为Excel文件不仅方便用户查看和分析,还能提高数据处理的效率。ApachePOI是一个常用的JavaExcel处理库,但它在处理大数据量时性能较差。为此,阿里巴巴开源了EasyExcel,这是一个基于Java......
  • 基于springboot电商个性化推荐系统设计与实现
    前言伴随着我国社会的发展,人民生活质量日益提高。于是对电商个性化推荐进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套电商个性化推荐系统,帮助商家进行商品信息、在线沟通等繁琐又......
  • 基于springboot大学生志愿者管理系统设计与实现
    前言系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对大学生志愿者管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想,在大学生志愿者管理系统......
  • 基于springboot导师选择管理系统设计与实现
    前言伴随着我国社会的发展,人民生活质量日益提高。于是对导师选择管理进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套导师选择管理系统,帮助学校进行导师选择管理等繁琐又重复的工作......
  • 基于springboot超市在线销售系统的设计与实现
    前言当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统超市在线销售采取了人工的管理方法,但这种管理方法存在着许多弊端,比如效率低下......
  • 基于springboot的城市公交运营管理系统设计与实现
    前言二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设计并实现了一个基于springboot城市公交运营......
  • springboot使用start集成es踩坑记录:不要使用严格动态
    在建立索引时,我使用了"dynamic":"strict",保证不会传入脏数据。然后我使用了<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>......