Spring源码解析 配置文件装载与解析

Spring源码——容器的基本实现 前言 内容主要参考自《Spring源码深度解析》一书,算是读书笔记或是原书的补充。进入正文后可能会引来各种不适,毕竟阅读源码是件极其痛苦的事情。 本文主要涉及书中第二章的部分,依照书中内容以及个人理解对Spring进行了注释,详见Github仓库:https://github.com/MrSorrow/spring-framework I. 容器基本用法 测试工程 在上一篇文章中,已... 阅读详情
以下内容有部分摘自网络 


步骤A. 读取 Resource 文件形成 Document 模型 

    类图: XmlBeanFactory -> XmlBeanDefinitionReader 

    Spring 使用 XmlBeanDefinitionReader 来读取并解析 xml 文件,XmlBeanDefinitionReader 是 BeanDefinitionReader 接口的实现。 
    BeanDefinitionReader 定义了 Spring 读取 Bean 定义的一个接口,这个接口中有一些 loadBeanDefinitions 方法, 用于读取 Bean 配置。 
    BeanDefinitionReader 接口有两个具体的实现,其中之一就是从 Xml 文件中读取配置的 XmlBeanDefinitionReader,另一个则是从 Java Properties 文件中读取配置的PropertiesBeanDefinitionReader。
    (注:开发人员也可以提供自己的 BeanDefinitionReader 实现,根据自己的需要来读取 spring bean 定义的配置。) 

步骤B. 解析 Document 得到 Bean 配置 

    类图: XmlBeanDefinitionReader-> BeanDefinitionDocumentReader 

    BeanDefinitionDocumentReader 接口中只定义了一个方法 registerBeanDefinitions. 有一个默认实现 DefaultBeanDefinitionDocumentReader. 
    DefaultBeanDefinitionDocumentReader 主要完成两件事情,解析 <bean> 元素,为扩展 spring 的元素寻找合适的解析器,并把相应的元素交给解析器解析。 



过程: 
    在 XmlBeanFactory 中创建了 XmlBeanDefinitionReader 的实例,并在 XmlBeanFactory 的构造方法中调用了 XmlBeanDefinitionReader 的 loadBeanDefinitions 方法,由 loadBeanDefinitions 方法负责加载 bean 配置并把 bean 配置注册到 XmlBeanFactory 中。 
    在 XmlBeanDefinitionReader 的 loadBeanDefinitions 方法中, 调用 DefaultDocumentLoader 的 loadDocument 读取配置文件为 Document, 然后调用 BeanDefinitionDocumentReader 的 registerBeanDefinitions 方法 来解析 Bean. 



源码解析: 

在XmlBeanFactory初始化时, 需要指定Resource对象. 
Java代码   收藏代码
  1. public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory)  
  2.     throws BeansException  
  3. {  
  4.     super(parentBeanFactory);  
  5.     reader = new XmlBeanDefinitionReader(this);  
  6.     reader.loadBeanDefinitions(resource);  
  7. }  

1. 先来分析下XmlBeanDefinitionReader这个类. 
Java代码   收藏代码
  1. public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader  

接着 
Java代码   收藏代码
  1. public abstract class AbstractBeanDefinitionReader  
  2.     implements BeanDefinitionReader  

再继续 
Java代码   收藏代码
  1. public interface BeanDefinitionReader  

在BeanDefinitionReader中定义有许多loadBeanDefinitions方法 
Java代码   收藏代码
  1. public abstract int loadBeanDefinitions(Resource resource)  
  2.     throws BeanDefinitionStoreException;  
  3.   
  4. public abstract int loadBeanDefinitions(Resource aresource[])  
  5.     throws BeanDefinitionStoreException;  
  6.   
  7. public abstract int loadBeanDefinitions(String s)  
  8.     throws BeanDefinitionStoreException;  
  9.   
  10. public abstract int loadBeanDefinitions(String as[])  
  11.     throws BeanDefinitionStoreException;  

来回头看XmlBeanDefinitionReader对loadBeanDefinitions方法的实现 
在loadBeanDefinitions方法中调用了doLoadBeanDefinitions方法, 跟踪doLoadBeanDefinitions方法 
Java代码   收藏代码
  1. Document doc = documentLoader.loadDocument(inputSource, getEntityResolver(), errorHandler, validationMode, isNamespaceAware());  

通过一个叫documentLoader的东西的loadDocument方法来加载配置文件形成DOM, 来看看documentLoader 
Java代码   收藏代码
  1. private DocumentLoader documentLoader  
  2. ...  
  3. documentLoader = new DefaultDocumentLoader();  

跟踪到DefaultDocumentLoader 
Java代码   收藏代码
  1. public class DefaultDocumentLoader  
  2.     implements DocumentLoader  
  3. ...  
  4.     public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware)  
  5.         throws Exception  
  6.     {  
  7.         DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);  
  8.         if(logger.isDebugEnabled())  
  9.             logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]");  
  10.         DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);  
  11.         return builder.parse(inputSource);  
  12.     }  
  13. ...  

哦哦, 我们知道了, 是通过sax解析得到Dom的, 至于怎么解析, 不属于Spring范畴, 不做研究. 

在这一步, 已完成了从配置文件读取到Domcument. 接着要开始解析Dom了 

再继续, 解析成Dom后接着调用了registerBeanDefinitions方法 
Java代码   收藏代码
  1. return registerBeanDefinitions(doc, resource);  

来看看registerBeanDefinitions的实现 
Java代码   收藏代码
  1. ...  
  2. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();  
  3. int countBefore = getRegistry().getBeanDefinitionCount();  
  4. documentReader.registerBeanDefinitions(doc, createReaderContext(resource));  
  5. return getRegistry().getBeanDefinitionCount() - countBefore;  
  6. ...  

在这里, 有一个BeanDefinitionDocumentReader接口, 实际上Spring对它有一个默认的实现类叫DefaultBeanDefinitionDocumentReader, 来看看它的家族 
Java代码   收藏代码
  1. public class DefaultBeanDefinitionDocumentReader   

Java代码   收藏代码
  1. public interface BeanDefinitionDocumentReader  

BeanDefinitionDocumentReader只有一个registerBeanDefinitions方法 
Java代码   收藏代码
  1. public abstract void registerBeanDefinitions(Document document, XmlReaderContext xmlreadercontext)  
  2.     throws BeanDefinitionStoreException;  

该方法需要两个参数, 一个是Document模型,这个应该是我们读取配置文件获取到的, 另一个是XmlReaderContext对象, 我们在上面方法中看到是通过createReaderContext(resource)得到的, 那就看看具体如何得到 
Java代码   收藏代码
  1. protected XmlReaderContext createReaderContext(Resource resource)  
  2. {  
  3.     if(namespaceHandlerResolver == null)  
  4.         namespaceHandlerResolver = createDefaultNamespaceHandlerResolver();  
  5.     return new XmlReaderContext(resource, problemReporter, eventListener, sourceExtractor, this, namespaceHandlerResolver);  
  6. }  

能过构造函数new出来的, 且有一个重要参数resource 
再继续来看DefaultBeanDefinitionDocumentReader对BeanDefinitionDocumentReader的registerBeanDefinitions方法实现 
Java代码   收藏代码
  1.   public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext)  
  2.   {  
  3.       ...  
  4. BeanDefinitionParserDelegate delegate = createHelper(readerContext, root);  
  5. ...  
  6.       parseBeanDefinitions(root, delegate);  
  7.       ...  
  8.   }  

嘿嘿, 开始解析Dom了哦, 其中主要是parseBeanDefinitions方法, 来看看具体是如何解析的 
Java代码   收藏代码
  1. protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)  
  2. {  
  3.     if(delegate.isDefaultNamespace(root.getNamespaceURI()))  
  4.     {  
  5.         NodeList nl = root.getChildNodes();  
  6.         for(int i = 0; i < nl.getLength(); i++)  
  7.         {  
  8.             org.w3c.dom.Node node = nl.item(i);  
  9.             if(node instanceof Element)  
  10.             {  
  11.                 Element ele = (Element)node;  
  12.                 String namespaceUri = ele.getNamespaceURI();  
  13.                 if(delegate.isDefaultNamespace(namespaceUri))  
  14.                     parseDefaultElement(ele, delegate);  
  15.                 else  
  16.                     delegate.parseCustomElement(ele);  
  17.             }  
  18.         }  
  19.   
  20.     } else  
  21.     {  
  22.         delegate.parseCustomElement(root);  
  23.     }  
  24. }  

看到了吧, 循环解析Domcument节点 
parseDefaultElement方法和delegate的parseCustomElement方法 
先来看parseDefaultElement方法 
Java代码   收藏代码
  1. private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)  
  2. {  
  3.     if(DomUtils.nodeNameEquals(ele, "import"))  
  4.         importBeanDefinitionResource(ele);  
  5.     else  
  6.     if(DomUtils.nodeNameEquals(ele, "alias"))  
  7.         processAliasRegistration(ele);  
  8.     else  
  9.     if(DomUtils.nodeNameEquals(ele, "bean"))  
  10.         processBeanDefinition(ele, delegate);  
  11. }  

看到这就很清楚了, 就是根据节点的名称作不同解析, 如我们Spring配置文件中常有以下几种配置 
Java代码   收藏代码
  1. <import resource="classpath:xxx" />  
  2. <bean id="xxx" class="xxx.xxx.xxx" />  
  3. <alias name="xxxx" alias="yyyyy"/>  

对<import>节点, 调用importBeanDefinitionResource方法解析, 此方法中, 又回到第一步读取配置文件并解析. 如此递归循环. 
Java代码   收藏代码
  1. ...  
  2. Resource relativeResource = getReaderContext().getResource().createRelative(location);  
  3. int importCount = getReaderContext().getReader().loadBeanDefinitions(relativeResource);  
  4. ...  

对<alias>节点, 调用processAliasRegistration进行别名解析 
我们主要看对<bean>节点调用processBeanDefinition进行解析 
Java代码   收藏代码
  1. protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)  
  2. {  
  3.     BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);  
  4.     if(bdHolder != null)  
  5.     {  
  6.         bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);  
  7.         try  
  8.         {  
  9.             BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());  
  10.         }  
  11.         catch(BeanDefinitionStoreException ex)  
  12.         {  
  13.             getReaderContext().error("Failed to register bean definition with name '" + bdHolder.getBeanName() + "'", ele, ex);  
  14.         }  
  15.         getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));  
  16.     }  
  17. }  

嘿嘿, 又用到delegate对象了, 且调用它的BeanDefinitionHolder方法, 返回一个BeanDefinitionHolder, 进去看它的parseBeanDefinitionElement方法 
Java代码   收藏代码
  1. public class BeanDefinitionParserDelegate  
  2. {     
  3.     private final Set usedNames = new HashSet();  
  4.     ...  
  5.     public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean)  
  6.     {  
  7.         ... 解析id, name等属性, 并验证name是否唯一, 并将name保存在usedNames中  
  8.         AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);  
  9.         ...   
  10.         return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);  
  11.     }  
  12.     ...  
  13. }  

可以看到, 在BeanDefinitionHolder中保存了BeanDefinition的定义 
OK, 重头戏开始, 最经典的部分出现了, 请看parseBeanDefinitionElement方法 
Java代码   收藏代码
  1. public AbstractBeanDefinition parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean)  
  2. {  
  3.     ...  
  4.     代码太长, 请参考具体代码  
  5.     AbstractBeanDefinition bd = BeanDefinitionReaderUtils.createBeanDefinition(parent, className, readerContext.getBeanClassLoader());  
  6.     ...  
  7.     return abstractbeandefinition;  
  8.     ...  
  9. }  

在这个方法中, 解析了bean的所有属性, 有最常用的class, scope, lazy-init等等. 并返回一个AbstractBeanDefinition实例. 至于具体怎么解析, 就只能进一步跟踪了, 不过既然到了这一步, 已经明白了它的基本原理, 具体实现就不作介绍 

这一步将节点解析成BeanDefinitionHolder对象, 再看看如何注册, 回到DefaultBeanDefinitionDocumentReader的processBeanDefinition方法 
看到对解析到的bdHolder对象又做了decorateBeanDefinitionIfRequired操作, 来看看实现 
... 暂留空 

接着调用了BeanDefinitionReaderUtils的registerBeanDefinition方法注册bdHolder, 来看看如何实现的 
Java代码   收藏代码
  1. public class BeanDefinitionReaderUtils  
  2. {  
  3.     public static void registerBeanDefinition(BeanDefinitionHolder bdHolder, BeanDefinitionRegistry beanFactory)  
  4.         throws BeanDefinitionStoreException  
  5.     {  
  6.         String beanName = bdHolder.getBeanName();  
  7.         beanFactory.registerBeanDefinition(beanName, bdHolder.getBeanDefinition());  
  8.         String aliases[] = bdHolder.getAliases();  
  9.         if(aliases != null)  
  10.         {  
  11.             for(int i = 0; i < aliases.length; i++)  
  12.                 beanFactory.registerAlias(beanName, aliases[i]);  
  13.   
  14.         }  
  15.     }  
  16. }  

看吧, 又调用了BeanDefinitionRegistry的registerBeanDefinition方法, 跟踪之 (这个要看DefaultListableBeanFactory的实现) 
Java代码   收藏代码
  1. public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory  
  2.     implements ConfigurableListableBeanFactory, BeanDefinitionRegistry  
  3. {  
  4.     private final Map beanDefinitionMap;  
  5.     private final List beanDefinitionNames;  
  6.     ...  
  7.     public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)  
  8.         throws BeanDefinitionStoreException  
  9.     {  
  10.         ...  
  11.         Object oldBeanDefinition = beanDefinitionMap.get(beanName);  
  12.         ...  
  13.         beanDefinitionMap.put(beanName, beanDefinition);  
  14.         ...  
  15.     }  
  16. }  

这里, 看到了一个最最重要的对象就是beanDefinitionMap, 这个map存放了所有的bean对象, 和我们通常讲的容器概念最为接近, getBean时实际是也是从这里辚取对象, 相同的还有一个beanDefinitionNames, 但这个只保存bean的名称 
完成上面之后, 还有一步操作beanFactory.registerAlias(beanName, aliases[i]); 
这个实现实际是上AbstractBeanFactory抽象类所定义的 

是不是特兴奋, 已经揭开它神秘的面纱了 
定义 -> 定位 -> 装载 -> 注册 这几步已经完成了, 以后继续看Spring是如何创建bean及实例化的
12-Spring架构源码分析-IoC 之装载 BeanDefinitions 总结 前面 从源码层次,分析了 IoC BeanDefinition 装载的整个过程,这篇就这些内容做一个总结将其连贯起来。在前文提过,IoC 容器的初始化过程分为三步骤:Resource 定位、BeanDefinition 的载入和解析,BeanDefinition 注册。整体步骤Resource 定位。我们一般用外部资源来描述 Bean 对象,所以在初始化 IoC 容器的第一步就是需要定位这个外部资源。在上一篇《IoC 之 Spring 统一资源加载策略》已经详细说明了资源加载的过程。... 阅读详情

相关推荐

Spring Boot配置类原理、Spring Boot核心机制理解,以及实现自动装置的底层原理

Spring、Spring Boot、java

zhangfuping123456789的博客 3789

spring源码中流InputSource 转化成 Document过程

spring源码中流InputSource 转化成 Document过程分享

nandao158的博客 1277

[springboot一本通]-3.1.结合源码讲解bean自动装配原理

在本专栏一开始,我们就讲过Spring Boot大量的简化了配置。实际上这些配置还都存在,只是将一些不常用的配置隐藏了起来,不需要我们像以往一样逐一配置,从而减少了配置量、提高了开发效率。本文向大家介绍一下,Spring Boot实现自动配置加载的原理。...

字母哥博客 939

java builder.parse_java – DocumentBuilder.parse关闭InputStream

使用以下测试代码查看输入流是否关闭,您可以看到哪条代码行关闭流.public class DocumentBuilderTest {public static void main(String[] args) {try {InputStream is = new MyInputStream("project.xml");DocumentBuilderFactory dbf = DocumentBu...

weixin_33976326的博客 528

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

p6666666668的博客 1588

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

Spring-Mybatis源码解析--Mybatis配置文件解析

Spring 整合Mybatis 后,如何对其配置文件进行加载和解析,如何进行数据的CRUD。Spring 中主要通过 SqlSessionFactoryBuilder().build(reader) 方法完成 事务管理器,数据源以及sql 语句的解析和绑定,并将解析好的sql 放入到map 中,执行时通过key 获取具体的sql 语句交由执行器执行,然后返回执行结果。

拽着尾巴的鱼儿的博客 352

告别抓包失败!保姆级配置:让Burp+Proxifier稳定抓取任意微信小程序

本文提供了一套完整的Burp+Proxifier配置方案,确保稳定抓取微信小程序数据。从环境准备、工具选型到Burp Suite深度配置和Proxifier精准设置,详细解决了证书安装、进程捕获和乱码解析等核心问题,帮助开发者告别抓包失败,提升调试效率。

weixin_28738165的博客 454

详解Spring配置文件

详解Spring配置文件

逐梦苍穹的博客 5911

龙迅LT9611UXC芯片简介:Dual-Port MIPI DSI/CSI to HDMI2.0 with Audio

龙迅半导体推出的LT9611UXC是一款高性能MIPI转HDMI2.0转换器,支持DSI/CSI接口转换,兼容多种视频格式(RGB/YCbCr),最高支持4K@60Hz输出。该芯片集成音频处理(I2S/SPDIF)、色彩空间转换和3D功能,适用于机顶盒、电视盒子等消费电子及车载设备。提供工业级(-40℃~+85℃)和车规级(AEC-Q100认证)版本,采用QFN64封装。

MB16698594834的博客 1334

C#单例模式在工控上位机的实战应用:一台设备只连一次,稳定运行7×24小时

在工控行业,稳定性比功能更重要。一台上位机需要7×24小时运行,任何一次因资源冲突导致的停机,都可能给工厂带来巨大损失。单例模式的核心价值,就是通过保证资源唯一性,避免PLC连接冲突、串口占用、日志写入错乱等问题,为工控上位机的稳定运行保驾护航。按需使用:不是所有类都要单例,只有资源唯一性的类才用;线程安全:多线程场景下,必须用双重检查锁定或静态内部类写法;手动释放:单例类中的硬件资源(PLC、串口),程序退出时必须手动释放,避免资源泄漏。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 549

一、Spring配置文件详解

Spring默认情况下也是通过无参构造方法来创建对象的,所以上面的bean的内部必须存在无参构造方法,也就是UserDaoImpl这个类中必须存在无参构造方法。

qq_48269763的博客 295

57、振荡扫描仪的挠性枢轴:原理、设计与材料选择

本文深入探讨了振荡扫描仪中挠性枢轴的工作原理、设计方法与材料选择。挠性枢轴因其无润滑、高精度、低周期性误差和潜在无限寿命等优势,广泛应用于光学、太空、医学和半导体等领域。文章分析了其在小角度下的优异性能与无法连续旋转等局限性,提供了关键设计公式,并对比了多种挠性材料的性能指标。同时,结合不同应用场景提出设计优化策略,并展望了微型化、智能化和高性能材料等未来发展趋势,为工程实践提供了系统的设计流程与选型建议。

numpy6sculptor的博客 95

XmlBeanDefinitionReader-----Spring源码解析 配置文件装载与解析

以下内容有部分摘自网络 步骤A. 读取 Resource 文件形成 Document 模型     类图: XmlBeanFactory -> XmlBeanDefinitionReader     Spring 使用 XmlBeanDefinitionReader 来读取并解析 xml 文件,XmlBeanDefinitionReader 是 BeanDefinitionR

Anglebeat的专栏 4833

BevFusion (1): 传感器介绍

激光雷达,也称光学雷达(LIght Detection And Ranging)是激光探测与测距系统的简称,它通过测定传感器发射器与目标物体之间的传播距离,分析目标物体表面的反射能量大小、反射波谱的幅度、频率和相位等信息,从而呈现出目标物精确的三维结构信息。激光雷达是自动驾驶车辆的关键传感器,如下图所示,车辆上方旋转的圆柱体对应就是激光雷达传感器。

@bangbang的博客 1475

Pytorch实现EdgeCNN(基于PyTorch实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

[springboot一本通]-3

实际上这些配置还都存在,只是将一些不常用的配置隐藏了起来,不需要我们像以往一样逐一配置,从而减少了配置量、提高了开发效率。(通常情况下配置A和B会有默认值,来决定默认的装载行为,这样就不需要我们配置了,进一步减少配置量)我们之前为大家介绍了,Spring Boot里面的各种Bean(类对象)能够实现自动装载,自动的装载帮我们减少了XML的配置,和手动编码进行Bean的加载工作。就是我们下一步要探究的问题了。:修改SpringBoot自动配置的默认值,通过配置来影响SpringBoot自动加载行为。

2401_89190823的博客 700

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spring源码深度解析_Spring的底层源码解析

Spring 运行原理 : Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上 层应用提供准备就绪的运行环境。 然后spring容器会定义一个Bean注册表,之后会根据注册表的信息,去加载到Bean实现类,实例化bean的实现类,在实例化的过程当中,完成一个...

weixin_39609483的博客 4330

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring源码之容器的基本实现:通过Xml配置装载Bean

Spring通过Xml配置来装载Bean的的流程: 读取xml配置文件 》解析Xml并找到对应类的配置 》实例化对象 环境准备 这是一个简单的bean public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 这是一个简单的bean配置(web.xml) &lt.

u013998466的博客 489

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spring Bean实例创建装载过程分析-spring源码学习(2)

定义阶段主要涉及Bean定义的加载和解析,这一过程的核心是将Bean定义的描述信息映射至BeanDefinition对象中,以便后续的Bean实例化操作使用。通过上述的分析,我们可以看到Spring Bean实例创建装载过程是一个复杂的过程,其中包含多个阶段和细节,这也表明Spring框架的强大之处正是在于这种复杂的Bean实例化和装载机制。如果我们能够了解并熟练地运用Spring Bean实例创建装载的整个过程,相信对于我们开发高质量的应用程序将会大有益处。

pp的博客 621

Spring 学习日记 (1)配置文件的装载

这次就不啰嗦 直接上 (以下资料都是查互联网之后加上自己的理解整理出来的 纯粹作为笔记自己学习下 没有其他什么意思 )Spring最重要的就是IOC和AOP 对于IOC来说在配置文件中你配置好了对象和对象之间的关系 但是你如何来读取这个配置文件呢 首先来看读取配置文件的XmlBeanFactory 在这里面需要指定Resource对象也就是xml文件XmlBeanFactory继承自De

大萌萌德 543

Spring boot自动装载(源码解析)

过几天公司培训,我这边整理了下PPT。顺便写了点代码,我放GitHub上了 Springboot 的基本认识 对于 spring 框架,我们接触得比较多的应该是 spring mvc、 和 spring。而 spring 的核心在于 IOC(控制反转)和 DI (依赖注入)。而这些框架在使用的过程中会需要配置大量 的 xml,或者需要做很多繁琐的配置。 springboot 框...

小学僧的博客 543

spring 源码分析

这边通过缓存中的 ObjectFactory 拿到的 bean 实例虽然拿到的是 “不完整” 的bean 实例,但是由于是单例,所以后续初始化完成后,该 bean 实例的引用地址并不会变,所以最终我们看到的还是完整 bean 实例。(2)二级缓存earlySingletonObjects:判断bean是否存在AOP,不存在AOP保存半成品的bean(属性暂未填充),存在AOP保存代理bean的beanProxy(目标bean还是半成品的)refresh() 方法是 Spring 上下文启动的核心方法。

qq_51470789的博客 2187

深入理解Spring系列之四:BeanDefinition装载前奏曲

框架的源码分析,有些代码可以暂时忽略,如Spring如何进行XML模式校验的、XML解析的细节等,这些代码可以在了解了整体的原理之后,再做针对性的分析,关注重点内容即可,切记在一开始就去深挖每个细节,这样不仅会耗费很长时间,而且容易陷入某个坑里出不来。 以《深入理解Spring系列之一》示例中的ApplicationContext applicationContext = new ClassPa...

pyd950812的博客 207

spring-core 源码学习-IoC 之装载 BeanDefinitions 总结(十五)

spring-core IoC 之装载 BeanDefinitions 总结 前面 13 篇博文从源码层次,分析了 IoC BeanDefinition 装载的整个过程,这篇就这些内容做一个总结将其连贯起来。1. Resource 定位2. BeanDefinition 的载入和解析2.1 转换为 Document 对象2.2 注册 BeanDefinition 流程2.2.1 对 Document 对象的解析2.2.1.1 默认标签解析2.2.1.2 自定义标签解析2.2.2 注册 BeanDefinit

sunchuanwen1111的博客 199
上一篇: 1.2.21 Map.values方法——获取Map集合中的所有键值对象
下一篇: 由Tomcat 8005端口想到的...
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值