IOC 是如何工作的?
通过 ApplicationContext 创建 Spring 容器,容器读取配置文件 “/beans.xml” 并管理定义的 Bean 实例对象。
 
通过 ApplicationContext.getBean 获取 Bean 实例。
 
IOC 容器经历的几个阶段:Resource 定位、载入 BeanDefinition、将 BeanDefinition 注册到容器。
 
Resource 定位
 
Resource 是 Spring 中用于封装 I/O 操作的接口。主要有:
 
FileSystemResource:以文件绝对路径进行资源访问
 
ClassPathResource:以类路径的方式访问资源
 
ServletContextResource:web 应用根目录的方式访问资源
 
UrlResource:访问网络资源的实现类
 
ByteArrayResource:访问字节数组资源的实现类
 
 
 
Spring 提供了 ResourceLoader 接口用于实现不同的 Resource 加载策略,该接口的实例对象可以获取一个 Resource 对象。
 
在 ResourceLoader 接口中定义了两个方法:
Resource getResource(String location); // 通过提供的资源 location 参数获取 Resource 实例
ClassLoader getClassLoader(); // 获取 ClassLoader, 通过 ClassLoader 可将资源载入 JVM
 
ApplicationContext 的所有实现类都实现了 ResourceLoader 接口,所以可以直接调用 getResource 获取 Resource 对象。
 
获取到 Resource 后就完成了资源定位,接下来就可以用 I/O 载入 Bean.
 
载入 BeanDefinition
BeanDefinition 是一个数据结构(interface),描述了一个 bean 实例,它具有属性值、构造函数参数值以及由具体实现提供的更多信息。
 
Bean 会在 Spring IOC 容器内以 BeanDefinition 的形式存在,IOC 容器对 Bean 的管理和依赖注入都是通过操作 BeanDefinition 来完成的。
 
Resource 定位后,由 ApplicationContext 的实现类读取 Resource,并加载为 BeanDefinition。
 
我们通常使用 @Configuration 配置类来定义 Bean,这类 Bean 就是通过 AnnotationConfigApplicationContext 获取的。
 
 
obtainFreshBeanFactory()
在之前的文章中说到,Spring 上下文初始化最重要的方法 refresh(),其中有4个方法,
 
而 obtainFreshBeanFactory() 就是用于解析 Spring 配置文件,
 
将所有 Spring 配置文件中的 Bean 定义封装成 BeanDefinition,加载到 BeanFactory 中。
 
以下是 IOC 容器初始化流程图

Spring Ioc 容器初始化过程的更多相关文章

  1. Spring IoC容器初始化过程学习

    IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...

  2. 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式

    Spring框架的核心是依赖注入.切面:Spring Boot是在Spring框架的基础上为其提供许多默认配置.默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用.快速上手:Spring ...

  3. spring源码学习之路---深度分析IOC容器初始化过程(四)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近由于工作和生活,学习耽搁 ...

  4. Spring源码解析二:IOC容器初始化过程详解

    IOC容器初始化分为三个步骤,分别是: 1.Resource定位,即BeanDefinition的资源定位. 2.BeanDefinition的载入 3.向IOC容器注册BeanDefinition ...

  5. Spring源码分析:Spring IOC容器初始化

    概述: Spring 对于Java 开发来说,以及算得上非常基础并且核心的框架了,在有一定开发经验后,阅读源码能更好的提高我们的编码能力并且让我们对其更加理解.俗话说知己知彼,百战不殆.当你对Spri ...

  6. 03.Spring IoC 容器 - 初始化

    基本概念 Spring IoC 容器的初始化过程在监听器 ContextLoaderListener 类中定义. 具体由该类的的 configureAndRefreshWebApplicationCo ...

  7. Spring之IOC容器初始化过程

    Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动. 具体来说这个启动过程包括三个基本过程: 1.BeanDifinition的Resource定位 2.Bean ...

  8. Spring Boot IoC 容器初始化过程

    1. 加载 ApplicationContextInializer & ApplicationListener 2. 初始化环境 ConfigurableEnvironment & 加 ...

  9. IOC容器初始化过程

    原文链接请参见:http://blog.csdn.net/u010723709/article/details/47046211

随机推荐

  1. IceCream in Python

    IceCream in Python 你还在使用print 在Python 中 debug 吗?赶快使用Icecream吧. 提到 Icecream,你是不是会想到ta? 动机 如果你使用print去 ...

  2. 二、mybatis之数据输出

    上一篇我们做了一个入门案例,是我们做mybatis的基本步骤,不熟悉的可以回顾一下https://www.cnblogs.com/jasmine-e/p/15330355.html,在这篇文章中只是简 ...

  3. .Net微服务实战之可观测性

    系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战 ...

  4. Unity——对象池管理

    Unity对象池管理 一.Demo展示 二.逻辑 在游戏中会出现大量重复的物体需要频繁的创建和销毁:比如子弹,敌人,成就列表的格子等: 频繁的创建删除物体会造成很大的开销,像这种大量创建重复且非持续性 ...

  5. linux下修改IP地址的方法

    linux下修改IP地址的方法 1.网卡的命名规则 在centos7中,en表示着:ethernet以太网,即现在所用的局域网,enX(X常见有以下3种类型) 2.IP地址的临时修改(重启后失效) 查 ...

  6. appium+Andriod环境搭建遇到问题

    报错:Caused by: org.openqa.selenium.WebDriverException: An unknown server-side error occurred while pr ...

  7. Java(36)IO流案例与总结

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228455.html 博客主页:https://www.cnblogs.com/testero ...

  8. springcloud (一)系统架构演变之路

    演变过程 从传统架构(单点应用)→分布式架构(以项目进行拆分)→SOA架构(面向服务架构)→微服务架构 1 传统架构 其实就是ssh架构或者ssm架构,属于单点应用,把整个开发业务模块都会在一个项目中 ...

  9. 使用包图 (UML Package Diagram) 构建模型架构

    包图用于以包包含层次结构的形式显示模型的组织方式.包图还可以显示包包含的模型元素以及包与其包含的模型元素之间的依赖关系. 在项目开发中,模型元素可能会很快达到大量数量,因此需要以某种方式构建它们,即使 ...

  10. UltraSoft - Beta - Scrum Meeting 1

    Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...