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. CF835E-The penguin‘s game【交互】

    正题 题目链接:https://www.luogu.com.cn/problem/CF835E 题目大意 长度为\(n\)的序列中有两个\(y\)其他都是\(x\),给出\(n,x,y\).你每次可以 ...

  2. ubuntu20.04安装网易云音乐

    Ubuntu20.04安装网易云 进入网易云音乐下载地址 下载对应客户端 进入终端,安装 sudo dpkg -i 软件名.deb

  3. python中return的返回和执行

    1 打印函数名和打印函数的执行过程的区别 例子1.1 def a(): print(111) print(a) # 打印a函数的内存地址,不会对a函数有影响,a函数不会执行 print(a()) # ...

  4. Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透

    在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...

  5. JavaScript04

    分离绑定事件 使用分离方式绑定元素事件可以使用页面元素与JavaScript代码完全分离,有利于代码分工和维护,是目前开发主流,分为两步: 1.获取需要绑定事件的元素 语法:根据id属性值取元素节点 ...

  6. 【UE4】基础概念——文件结构、类型、反射、编译、接口、垃圾回收、序列化

    新标签打开或者下载看大图 思维导图 Engine Structure Pipeline Programming Pipeline Blueprint Pipeline

  7. 【UE4】异步加载关卡 LoadingScreen ( 蓝图和C++ )

    一般先跳转到一个临时的关卡,然后异步加载目标关卡,同时展示Loading界面 对于含有流关卡的目标关卡,可以先载入子关卡 蓝图异步加载 无进度条 C++ 异步加载关卡 LoadPackageAsync ...

  8. k8s replicaset controller分析(2)-核心处理逻辑分析

    replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...

  9. 镜头Lens Image circle像圈的解释是什么意思

    Image circle镜头中指的是:像圈 像圈(image circle)是指入射光线通过镜头后,在焦平面上呈现出的圆形的明亮清晰的影像幅面,也称像面大小.镜头像圈由镜头光学结构决定,一旦设计完成, ...

  10. 零基础学习Linux心得总结

    很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...