Spring 的 IOC 容器

Stella981
• 阅读 829

一. BeanFactory 
1. 在 spring 中,最基本的 IOC 容器接口是 BeanFactory-这个接口为具体的 IOC 容器的实现 做了最基本的功能规定。 
 
2. 在 BeanFactory 只对 IOC 容器的基本行为做了定义,根本不关心你的 bean 是怎样定义怎 样加载的;XmlBeanFactory 就是针对最基础的 BeanFactory 的 IOC 容器的实现。这个实现就 是用 xml 文件来定义 IOC 容器中的 bean。 
 
3. Spring 提供了 BeanFactory 的基本实现。XmlBeanFactory 同样通过使用模版模式来得到 IOC 容器的抽象,AbstractBeanFactory,  DefaultListableBeanFactory 这些抽象类为其提 供模板服务。其中通过 resource 接口来抽象 bean 定义数据。对 Xml 定义文件的解析通过委托给 XmlBeanDefinitionReader 来完成。 
 
下面简单的演示 IOC 容器的创建过程: 
 
这些代码演示了以下几个步骤:

1)创建 IOC 配置文件的抽象资源

2)创建一个 BeanFactory

3)把读取配置信息的 BeanDefinitionReader,这是 XmlBeanDefinitionReader 配置给 beanFactory;

4)从定义好的资源位置读取配置文件,具体的解析过程交由 XmlBeanDefinitionReader 来完成;这样就完成了整个载入 bean 的过程,我们的 IOC 容器就建立起来了。 
 
二.BeanFactory 与上下文这两种 IOC 容器的区别: 
1)BeanFactory 与上下文在读取器读取资源和注册 bean 定义信息的整个过程的处理是一样 的。 
 
2)BeanFactory 往往不具备对资源定义的能力,而上下文可以自己完成资源定义。 
 
 
三.ApplicationContext 
1.  ApplicationContext 提供了 IOC 容器的主要接口。在其体系中有许多抽象子类比如 AbstractApplicationContext 为具体的 BeanFactory 的实现,比如FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 提供上下文的 模板,使得他们只需要关心具体的资源定位问题。 
 
2.  当应用程序代码实例化 FileSystemXmlApplicationContext 的时候。我们得到 IOC 容器 的一种具体的体现-ApplicationContext,从而应用程序通过 ApplicationContext 来管理对 bean 的操作。 

总结 IOC 容器的初始化步骤:

1. 初始化的入口在容器实现中的 refresh() 调用来完成  
2. 对 bean 定义载入 IOC 容器使用的方法是 loadBeanDefinition, 其中的大致过程如下: 通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader 是默认的实现, 同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径,文件系统, URL 等方式 来定为资源位置。如果是 XmlBeanFactory 作为 IOC 容器,那么需要为它指定 bean 定义的资 源,也就是说 bean 定义文件时通过抽象成 Resource 来被 IOC 容器处理的,容器通过 BeanDefinitionReader 来完成定义信息的解析和 Bean 信息的注册,往往使用的是 XmlBeanDefinitionReader 来解析 bean 的 xml 定义文件 - 实际的处理过程是委托给 BeanDefinitionParserDelegate 来完成的,从而得到 bean 的定义信息,这些信息在 Spring 中使用 BeanDefinition 对 象 来 表 示 - 这 个 名 字 可 以 让 我 们 想 到 loadBeanDefinition,registerBeanDefinition 这 些相 关的 方法 - 他们 都是 为处 理 BeanDefinitin 服务的,IoC 容器解析得到 BeanDefinition 以后,需要把它在 IOC 容器中 注册,这由 IOC 实现 BeanDefinitionRegistry 接口来实现。注册过程就是在 IOC 容器内 部维护的一个 HashMap 来保存得到的 BeanDefinition 的过程。这个 HashMap 是 IoC 容器持 有 bean 信息的场所,以后对 bean 的操作都是围绕这个 HashMap 来实现的。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
spring源码
SpringIOC容器源码解析系列,建议大家按顺序阅读,欢迎讨论(_spring源码均为4.1.6.RELEASE版本_)1.Spring源码IOC容器(一)构建简单IOC容器(https://my.oschina.net/u/2377110/blog/902073)2.Spring源码IOC容器(二)Bean的定位解析注
Easter79 Easter79
3年前
SpringIOC官方文档解读
IoC容器本章介绍了Spring的控制反转(IoC)容器。1.1。SpringIoC容器和Bean简介本章介绍了反转控制(IoC)原则的Spring框架实现。IoC也称为依赖注入(DI)。在此过程中,对象可以通过①构造函数参数(),②工厂方法的参数③或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依
Stella981 Stella981
3年前
Bean 实例化和获取
实例化BeanSpring实例化bean的时机有两个:1.IOC容器启动时候;2.真正调用的时候;如果bean声明为scopesingleton且lazyinitfalse,则容器启动时候就实例化该bean(Spring默认就是此行为)。否则在调用时候再进行实例化。IOC容器
Easter79 Easter79
3年前
Spring学习笔记一
IOC容器里配置beanapplicationContext.xml必须有个无参的构造器class:bean的全类名通过beanid获得这个bean必须唯一spring提供2种IOC容器容器实现方式beanfactory用在spring本身applicationContext用在开发者配置方式相同
Stella981 Stella981
3年前
Spring IOC 相关的面试题
Spring最基础的部分就是IOC,对IOC的理解程度从某个方面代表着你对Spring 的理解程度,看了网上的一些面试题,针对SpringIOC相关的重点是下面几个:1、Spring中Bean的生命周期是怎么样的?2、SpringIOC是如何实现的,如何加载Bean,如何创建单例Bean?3、BeanFactory和Application
Stella981 Stella981
3年前
Spring5.0源码深度解析之Spring基于注解启动流程分析🔥
主要内容:一、IOC容器的初始化流创建IOC容器注册配置类BeanFactory后置处理器Bean的后置处理器创建Bean对象
Easter79 Easter79
3年前
Spring必备知识点(一)
Spring框架的7个模块组成 Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:核心容器:核心容器提供 Spring框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用_控制反转_(IOC
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这