最近由于工作和生活,学习耽搁了几天,今天我们继续接着上一章,分析FileSystemXmlApplicationContext的构造函数,到底都做了什么,导致IOC容器初始化成功。
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(configLocations); if (refresh) { refresh(); } }
我们跟踪上一章FileSystemXmlApplicationContext的构造函数,可以发现它最终调用的是上面这个形式重载的构造函数,其中的refresh方法,便是IOC容器初始化的入口。下面我们继续跟踪代码进去看一下refresh方法。refresh方法位于AbstractApplicationContext中,这是一个抽象类,初步实现了ApplicationContext的一般功能,并且这里使用了模板模式,给以后要实现的子类提供了统一的模板。
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset "active" flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }
这里面列出了IOC容器初始化的大致步骤,第一步很容易看出来是初始化准备,这个方法里只是设置了一个活动标识,我们主要来看第二步,obtainFreshBeanFactory这个方法,它是用来告诉子类刷新内部的bean工厂,接下来我们跟踪进去看看。
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); } return beanFactory; }
该方法中第一句便调用了另外一个refreshBeanFactory方法,这个方法是AbstractApplicationContext中的抽象方法,具体的实现并没有在这个抽象类中实现,而是留给了子类,我们追踪到这个子类当中去看一下。该方法又子类AbstractRefreshableApplicationContext实现,我们来看
protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } }
方法加上了final关键字,也就是说此方法不可被重写,可以很清楚的看到,IOC容器的初始化就是在这个方法里发生的,第一步先是判断有无现有的工厂,有的话便会将其摧毁,否则,就会创建一个默认的bean工厂,也就是前面提到的DefaultListableBeanFactory,注意看loadBeanDefinitions(beanFactory);这里,当我们创建了一个默认的bean工厂以后,便是载入bean的定义。这与我们上一章所使用的原始的创建bean工厂的方式极为相似。
看到这里,其实不难看出,FileSystemXmlApplicationContext的初始化方法中,其实已经包含了我们上一章当中原始的创建过程,这个类是一个现有的,spring已经为我们实现好的BeanFactory的实现类。在项目当中,我们经常会用到。
今天天色已晚,改天鄙人带着各位去看一下IOC容器建立的要义,也就是载入bean定义的实现。
版权声明:本文版权归作者(左潇龙)所有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。原文地址:http://www.zuoxiaolong.com/html/article_129.html
相关推荐
手把手教你设计T型和Π型衰减器:从分贝计算到电阻选型全攻略
本文提供了一份T型和Π型衰减器的详细设计指南,涵盖从分贝计算到电阻选型的全过程。文章以50欧姆系统为例,通过公式推导和实例演示,手把手教你计算两种经典拓扑的电阻值,并深入探讨了电阻选型、误差控制及高频应用等关键实践技巧,帮助工程师和爱好者精准实现信号衰减与阻抗匹配。
Spring源码学习之路---深度分析IOC容器初始化过程(四)
原文地址:https://blog.youkuaiyun.com/zuoxiaolong8810/article/details/8566927 最近由于工作和生活,学习耽搁了几天,今天我们继续接着上一章,分析FileSystemXmlApplicationContext的构造函数,到底都做了什么,导致IOC容器初始化成功。[java] view plain copypublic Fi...
告别抓包失败!保姆级配置:让Burp+Proxifier稳定抓取任意微信小程序
本文提供了一套完整的Burp+Proxifier配置方案,确保稳定抓取微信小程序数据。从环境准备、工具选型到Burp Suite深度配置和Proxifier精准设置,详细解决了证书安装、进程捕获和乱码解析等核心问题,帮助开发者告别抓包失败,提升调试效率。
Spring源码分析 之 Spring IOC容器初始化过程(一)资源定位过程
Spring IOC容器初始化过程(一)资源定位过程 最近复习了一遍Spring IOC容器的初始化过程,结合书籍《Spring源码深度解析》总结了一下,IOC容器的初始化过程,大概分为以下三点: 定位资源 定位相关的配置文件,扫描相关注解 加载资源 将配置信息加载到内存中 注册 根据载入的配置信息,初始化对象,并将其装载至容器中 整体加载的时序图 工程目录 POM文件 <?xml version="1.0" encoding="UTF-8"?> <project x
别再只盯着Text-VQA了!这4个主流VQA数据集(含中英双语)的保姆级下载与对比指南
本文深入解析了Text-VQA、ST-VQA、OCR-VQA和EST-VQA这4个主流视觉问答数据集的特性与应用场景,提供了详细的下载与预处理指南。通过对比分析,帮助开发者根据项目需求选择最适合的数据集,避免因选型不当导致的模型性能问题,特别适合需要处理中英双语或多模态文本理解的AI项目。
保姆级教程:在紫光同创Titan2 FPGA上实现PCIe DMA,实测带宽接近理论极限
本文详细介绍了在紫光同创Titan2 FPGA上实现PCIe DMA性能调优的全过程,通过参数优化和架构设计,实测带宽达到6.91GB/s,接近理论极限。涵盖开发环境搭建、PCIe IP核定制、DMA引擎设计、驱动开发及性能调优等关键步骤,为FPGA开发者提供实用指南。
Spring深度学习:IOC容器及源码解析
大家经常戏称Java工程师为Spring工程师,毫无疑问,这句话体现出Spring框架在Java开发中的重要性和普及度。本文小豪将带大家深度学习Spring IOC底层源码,学习过程中不仅仅是了解Spring IOC的工作原理,更重要的是学会理解框架的底层逻辑,从而提升我们的思维能力。
D类功放几种常见“爆破音”问题根源与改善措施
在数字D类功放刚上电或功放播放状态切换时,人耳偶尔会听到“嘣”的声音,我们把这个爆破的Pop Noise。数字功放Pop Noise 出现的原因有很多,本文主要分析Pop Noise 出现原因,并提供相应解决方法。
Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】
基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图!
libjpeg-turbo图片解码 VS opencv
本文对比了libjpeg-turbo和opencv在图像解码层面的耗时情况,及解码数据是否存在diff
基于FFT的轴承故障诊断 - MATLAB代码和详细解释
最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。
深入剖析Spring IOC容器——原理、源码与实践全解析
本文深入解析Spring框架的核心设计思想——控制反转(IOC)与依赖注入(DI)。通过源码分析和可视化流程图,详细阐述了IOC容器的架构设计、Bean生命周期管理及其在现代框架中的演进。文章对比了三种依赖注入方式的适用场景,剖析了循环依赖的解决方案,并提供了性能优化建议与最佳实践。作者"励志成为糕手"强调理解IOC对掌握Spring设计哲学的重要性,指出IOC不仅是技术实现,更代表了软件开发范式的转变,能显著提升代码解耦性和可测试性。全文结合Spring 6.x最新源码,为开发者提供了
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
Spring IOC容器初始化全流程深度解析
关键数据结构注册过程解析@Component等注解转换为对象存入BeanDefinition关键属性属性名说明beanClassBean的Class对象scope作用域(singleton/prototype)lazyInit是否延迟初始化dependsOn依赖的Bean名称初始化方法销毁方法:在 Bean 实例的初始化前后 “拦截” 处理,适合修改实例本身(如代理增强):在 Bean 实例化前修改 “设计图”,适合动态配置 Bean 定义生命周期回调。
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
Spring源码分析:全集整理
本文是Spring源码分析系列文章的目录整理,主要基于《Spring源码深度解析》的学习记录。内容涵盖Spring核心功能源码分析、衍生技术解析及补充知识点,包括IOC容器、AOP实现、事务管理、Spring MVC等核心模块的源码解读。文章持续更新中,目前已包含25篇源码分析、13篇衍生技术探讨以及3篇补充内容,并附有Mybatis源码分析链接。作者在2021年期间持续更新,后期因技术沉淀需要暂停写作。
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
Spring源码解析一 (IOC容器初始化深度解析)
IOC容器的初始化的三种方式 XmlBeanFactory ClassPathXmlApplicationContext AnnotationConfigApplicationContext 三种初始化方式流程图: 分析: 由调用图可以看到不论使用哪一种方式去初始化IOC容器, 注册BeanDefinition的工作都是由DefaultListableBeanFactory的r...
Spring IoC容器初始化源码(8)—populateBean、initializeBean填充Bean、字段反射和setter方法依赖注入以及IoC容器初始化总结【四万字】
基于最新Spring 5.x,详细介绍了bean的“初始化过程”,主要包括applyMergedBeanDefinitionPostProcessors、populateBean、initializeBean、registerDisposableBeanIfNecessary核心方法,最后对Spring IoC容器初始化进行了总结!
基于JavaConfig的AnnotationConfigApplicationContext IoC容器初始化源码分析
基于最新Spring 5.x,对AnnotationConfigApplicationContext IoC容器的初始化过程的源码进行了简要分析。
【spring源码系列-02】通过refresh方法剖析IOC的整体流程
通过refresh方法剖析IOC的整体流程
Spring IoC容器初始化源码(2)—refresh方法入口、prepareRefresh准备刷新、obtainFreshBeanFactory加载XML资源、解析<beans/>标签【两万字】
基于最新Spring 5.x,对ClassPathXmlApplicationContext IoC容器的refresh()初始化方法进行了深度解析,包括refresh()方法概述、prepareRefresh()方法以及obtainFreshBeanFactory()方法中的XML资源的加载过程,以及< beans/>标签的解析过程!
Spring源码深度解析(二):IOC容器启动过程详解
前言 接上一篇文章,我们之前讲了Spring源码中的主要的类,这篇文章就详细讲一下IOC容器创建的详细过程。让我们看看平常遇到的@Bean,@Component,@ComponentScan等等注解是怎么产生作用的。 正文 来看一个非常非常简单的IOC容器的创建 package org.study.jimmy; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.study
Spring-IoC容器初始化全链路深度解析
important;important;fill:none;refresh()执行 ConfigurationClassPostProcessor注册所有 BeanPostProcessor实例化属性填充初始化返回 Bean 实例容器启动完成设计模式应用场景体现位置模板方法模式定义容器初始化流程骨架,子类实现具体步骤工厂模式根据 BeanDefinition 创建 Bean 实例单例模式保证单例 Bean 在容器中唯一存在观察者模式。
深度解析Spring IoC容器初始化:ApplicationContext的refresh()流程拆解
在Java企业级开发领域,Spring框架始终保持着不可撼动的统治地位。截至2025年,Spring Framework 6.x系列已成为主流版本,其核心设计理念"控制反转"(Inversion of Control,IoC)依然是理解整个框架架构的关键切入点。
1334



被折叠的 条评论
为什么被折叠?



