【深入spring】IoC容器的实现
本文乃学习整理参考而来
IoC概述:
在spring中,IoC容器实现了依赖控制反转,它可以再对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入方法调用的依赖,这种依赖注入是可以递归的,对象被逐层注入。对象之间的相互依赖关系由IoC容器管理,并由容器完成注入,如对象的创建、赋值等,这样很大程度简化开发。
结构图如下


1.1 BeanFactory
接口BeanFactory:体现了spring为提供给用户的IoC容器所设定的最基本功能规范。
接口BeanDefinition:spring通过BeanDefinition来管理spring容器中的各种对象以及他们之间的相互依赖关系。
源码如下
**
* IoC容器最基本功能
* 此类相当于容器中的具体容器产品
* @author qjc
*/
public interface BeanFactory { /**
* 获取产生对象的FactoryBean
* 如:myObject是一个FactoryBean,使用&myObject得到的是FactoryBean
*/
String FACTORY_BEAN_PREFIX = "&"; /**
* 获取IoC容器中管理的bean
* @param name
* @return
* @throws BeansException
*/
Object getBean(String name) throws BeansException; /**
* 判断容器是否含有指定名称的bean
* @param name
* @return
*/
boolean containsBean(String name); /**
* 检查指定名称的bean是否是单例(可以在BeanDefinition中指定)
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException; /**
* 检查指定名称的bean是否是prototype类型(可以在BeanDefinition中指定)
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException; /**
* 检查指定名称的bean的Class类型是否是特定Class类型
* @param name
* @param targetType 用户指定
* @return
* @throws NoSuchBeanDefinitionException
*/
boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException; /**
* 查询指定名称bean的Class类型
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
Class<?> getType(String name) throws NoSuchBeanDefinitionException; /**
* 查询指定名称bean的所有别名(用户在BeanDefinition中指定的)
* @param name
* @return
*/
String[] getAliases(String name);
}
说明:
在BeanFactory里只对IOC容器的基本行为作了定义,根本不关心你的bean是如何定义怎样加载的。正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。
1.2 IoC容器XmlBeanFactory
此类为IoC容器最底层的实现类,提供基本IoC功能。与ApplicationContext实现原理类似,通过持有或扩展DefaultListableBeanFactory来获取IoC容器功能。
关系结构图如下

源码
public class XmlBeanFactory extends DefaultListableBeanFactory {
/**
* XmlBeanDefinitionReader:读取XML的类
*/
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
/**
* @param resource spring用来封装io操作的类,可如下构建
* ClassPathResource resource = new ClassPathResource("bean.xml");
* @throws BeansException
*/
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}
IoC容器创建的基本步骤
ClassPathResource res = new ClassPathResource("bean.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
1、创建IoC配置文件的抽象资源(包含BenaDefinition定义信息)
2、创建BeanFactory
3、创建BeanDefinition读取器
4、读取配置信息,完成载入和注册后IoC容器就创建出来了
通常我们不是这么创建的,而是使用ApplictionContext接口创建
1.3 ApplictionContext
ApplictionContext属于高级IoC容器,它在BeanFactory基础上添加了特性(其他容器不具备)。
1. 支持信息源,可以实现国际化。(实现MessageSource接口)
2. 访问资源。(实现ResourcePatternResolver接口,这个后面要讲)
3. 支持应用事件。(实现ApplicationEventPublisher接口)
参考:
《Spring 技术内幕》
【深入spring】IoC容器的实现的更多相关文章
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
- 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境
前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...
- 学习Spring(一) 实例化Spring IoC容器
实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...
- MyEclipse Spring 学习总结一 Spring IOC容器
一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- 解读Spring Ioc容器设计图
在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...
- 纯注解快速使用spring IOC容器
使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...
- Spring IOC容器分析(2) -- BeanDefinition
上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...
- Spring IOC容器分析(4) -- bean创建获取完整流程
上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...
随机推荐
- linux 命令收集 阿里云nginx升级等 查看磁盘空间 版本等
—————————————————— 查磁盘 df -h此命令直观的呈现出磁盘大小有多少Gdf -hl文件系统 容量 已用 可用 已用% 挂载点/dev/hdb2 75G 75G 0 100% /就是 ...
- 编写优秀jQuery插件技巧
1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用. 不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面. 而方法可 ...
- 读取Excel中数据
#region 读取导入Excel数据 /// <summary> /// /// </summary> /// <param name="filename&q ...
- luogu P4778 Counting swaps
计数套路题?但是我连套路都不会,,, 拿到这道题我一脸蒙彼,,,感谢@poorpool 大佬的博客的指点 先将第\(i\)位上的数字\(p_i\)向\(i\)连无向边,然后构成了一个有若干环组成的无向 ...
- centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′
原文连接: http://blog.csdn.net/jaket5219999/article/details/53512071 系统red hat6.7 也即centos6.7 python3.5. ...
- latex 字体大小设置
tex 设置字体大小命令由小到大依次为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \ ...
- Apriori 算法python实现
1. Apriori算法简介 Apriori算法是挖掘布尔关联规则频繁项集的算法.Apriori算法利用频繁项集性质的先验知识,通过逐层搜索的迭代方法,即将K-项集用于探察(k+1)项集,来穷尽数据集 ...
- python将图片转换为Framebuffer裸数据格式(终端显示图片)【转】
转自:https://www.cnblogs.com/zqb-all/p/6107905.html 要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口, ...
- camera驱动框架分析(上)【转】
转自:https://www.cnblogs.com/rongpmcu/p/7662738.html 前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连 ...
- 命令查看WebSphere MQ运行状态
参考:https://wenku.baidu.com/view/34e40e2ffd0a79563c1e72b9.html 一.查看队列管理器运行状态 # dspmq 显示结果中QMNAME表示MQ队 ...