`

IoC容器的初始化过程

 
阅读更多
    IoC容器的初始化时由refresh()方法来启动的,这个方法标志着IoC容器的正式启动。具体来说,这个过程包括BeanDefinition的Resource定位、载入和祖册三个基本过程。如果我们了解如何编程式地使用IoC容器,就可以清楚地看到Resource定位和载入过程的接口调用。在下面的内容里,我们将会星系分析者三个过程的实现。
    Spring把这三个过程分开,并使用不同的模块来完成,如使用相应的ResourceLoader、BeanDefinitionReader模块,通过这样的设计方式,可以让用户更加灵活地对这三个过程进行裁剪或扩展,定义出最适合自己的IoC容器的初始化过程。
    第一个过程是Resource定位过程。这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一的接口。对于这些BeanDefinition的存在形式,相信大家都不会陌生。比如,在文件系统中的Bean定义信息可以使用FileSystemResource来进行抽象;在类路径中的Bean定义信息可以使用ClassPathResource来使用,等等。这个定位过程类似于容器寻找数据的过程,就像用水桶装水要先把水找到一样。
    第二个过程是BeanDefinition的载入,这个载入过程是把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器的内部数据结构就是BeanDefinition。具体来说,这个BeanDefinition实际上就是POJO在IoC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IoC容器能够方便地对POJO对象也就是Bean进行管理。
    第三个过程是向IoC容器注册这些BeanDefinition的过程。这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的。这个注册过程把载入过程中解析得到的BeanDefinition向IoC容器进行注册。通过分析,我们可以看到,在IoC容器内部将BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。
    值得注意的是,这里谈到的是IoC容器初始化过程,在这个过程中,一般不包括Bean依赖注入的实现。在Spring IoC的设计中,Bean定义的载入和依赖是两个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。但有一个例外值得注意。在使用IoC容器时有一个预实例化的配置,通过这个预实例化的配置(具体来说,可以通过为Bean定义信息中的lazyinit属性),用户可以对容器初始化过程作一个微小的控制,从而改变这个被设置了lazyinit属性的Bean的依赖注入过程。举例来说,如果我们对某个Bean设置了lazyinit属性,那么这个Bean的依赖注入在IoC容器初始化时就预先完成了,从而不必等到整个初始化完成以后,第一次使用getBean时才触发。
分享到:
评论

相关推荐

    Spring的IoC容器初始化源码解析

    Spring的IoC容器初始化源码解析,包括资源定位、加载、注册3个过程

    IOC容器初始化过程

    IOC容器的初始化分为三个过程实现:第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。这个过程就是容器找数据的过程,就像水桶装水需要先找到水一样。 第二个过程是BeanDefinition的载入...

    spring ioc和aop原理流程图(详细)

    spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图

    SSH笔记-IOC容器中 Bean 的生命周期

    SSH笔记-IOC容器中 Bean 的生命周期,通过实现BeanPostProcessor接口,来定义初始化方法和销毁方法时的逻辑

    08-IoC配置-bean的生命周期控制

    Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 Bean可以使用了 当容器关闭时,调用Bean的销毁方法 在 Bean ...

    nioc:Node.js 的 IoC 容器

    #NIoC(节点 IoC) 一个简单易用的 Node.js 的 IoC 容器。 执照 在 [MIT 许可证] ( ) 下发布。 强调 Bean 是通过一个简单的 JSON 文件定义的...初始化NIoC 在您的应用程序 index.js/server.js 文件中,只需要 NIoC 模

    深入解析Spring IoC:源码与实践指南

    同时,本文还探讨了Spring Bean的生命周期,重点在于Bean容器的创建与Bean的初始化过程。这些深入的分析不仅有助于理解Spring的内部工作机制,而且对于Java开发者来说,能够更好地掌握如何有效地使用Spring框架进行...

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...

    Spring基础.pdf

    多重对象嵌套,IoC容器就可以有效地帮我们去避免在程序中编写复杂的初始化逻辑,使开发 更便捷。 • IoC叫做控制反转,也就是我们失去了对于对象的创建权利的控制,IoC容器帮我们维护了所有 项⽬中对象的⽣命周期...

    深入解析Spring IoC源码:核心机制与实践应用

    本文深入探讨了Spring框架中IoC容器的源码机制,涵盖了容器的初始化、Bean工厂的实例化、Bean定义的读取及Spring Bean的生命周期管理。通过精细的分析,本文揭示了AnnotationConfigApplicationContext的实例化过程,...

    async-ioc:支持异步初始化的控制反转容器

    异步IoC容器警告:不是生产质量如果您不理解该代码,请自担风险。主要目的对于足够大的nodejs应用程序,您可能需要一些代码来引导服务器,特别是由于节点的异步特性。 例如,在服务器可以接受请求之前,您可能需要...

    spring-beans.zip

    它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/> 的形式定义。Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为...

    00-myspring.war

    初始化阶段:重写Servlet的init方法,实现加载配置文件,读取配置信息, 扫描所有相关的类, 初始化相关类的实例并保存到IOC容器, 从IOC容器取出对应的实例给字段赋值,即依赖注入, 最后将url和Method进行关联。...

    控制反转(IoC)与依赖注入(DI)1

    1. 软件系统在没有引IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者 2. 软件系统在引IOC容器之后,这种情形就完全改变了,如图2所示

    02-01-03-一步一步手绘Spring IOC运行时序图1

    1、通过分析 Spring 源码,深刻掌握核心原理和设计思想 2、通过本课的学习,完全掌握 SpringIOC 容器的初始化细节,并手绘时序图 3、掌握看源码不

    海创软件组-Spring 核心之IoC(一)

    目录 Spring IoC容器的两个接口 依赖注入的类型 Bean的配置 …IOC:控制反转依赖注入。它使程序组件或类之间尽量形成一种松耦合的结构,开发者在使用类的实列之前,需要先创建...BeanFactory在初始化的时候,不会被

    tiny-spring:一个很小的IoC容器指的是Spring

    一个很小的IoC容器是指Spring。 关于 tiny-spring是为了学习Spring的而开发的,可以认为是一个Spring的精简版。Spring的代码很多,层次复杂,阅读起来费劲。我尝试从使用功能的角度出发,参考Spring的实现,一步一步...

    Spring从入门到入土——Bean的作用域

    Bean的作用域Bean的作用域SingletonPrototypeRequestSessionGlobal Session 相关文章 跟着官网学spring—快速入门指南 跟着官网学Spring—构建RESTful Web服务 ...简单地讲,bean就是由IoC容器初始化、装配及管理的

    spring培训-笔记

    Bean的之前初始化 19 Bean的准备就绪(Ready)状态 21 Bean的销毁 21 ApplicationContext 21 Spring的AOP框架 21 Spring的数据层访问 22 Spring的声明式事务 22 Spring对其它企业应用支持 22 注:后面的...

Global site tag (gtag.js) - Google Analytics