【深入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 ...
随机推荐
- 第三节:工厂+反射+配置文件(手写IOC)对缓存进行管理。
一. 章前小节 在前面的两个章节,我们运用依赖倒置原则,分别对 System.Web.Caching.Cache和 System.Runtime.Cacheing两类缓存进行了封装,并形成了ICach ...
- Python生成唯一id的方法
1. uuid import uuid def create_uid(): return str(uuid.uuid1()) if __name__ == '__main__': print(type ...
- C - Musical Theme (后缀数组)
题目链接:https://cn.vjudge.net/contest/283743#problem/C 题目大意:给你n个数组,然后问你是否有多个“相似”且不重叠的子串的长度大于等于5(两个子串相似当 ...
- strstr函数字符串匹配问题
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2772.html AC代码: #inc ...
- IDEA常用快捷键[转]
原文:http://www.cnblogs.com/wxdlut/p/3410541.html 查询快捷键CTRL+N 查找类CTRL+SHIFT+N 查找文件CTRL+SHIFT+ALT+N ...
- ROS中的CMakeLists.txt
在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功.如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事.所以深入了解它是很有必要的.现在我们就来看看它 ...
- 基于theano的降噪自动编码器(Denoising Autoencoders--DA)
1.自动编码器 自动编码器首先通过下面的映射,把输入 $x\in[0,1]^{d}$映射到一个隐层 $y\in[0,1]^{d^{'}}$(编码器): $y=s(Wx+b)$ 其中 $s$ 是非线性的 ...
- vsftpd控制用户禁止访问上级目录 只能访问自己目录
涉及文件: vsftpd.conf chroot_list_file=/etc/vsftpd.chroot_list 如果设置为 chroot_local_user=YES chroot_list_e ...
- 分布式系列 - dubbo服务telnet命令【转】
dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...
- 生成ansible-playbook的yaml文件的代码(字典排序问题无法解决)
import yaml import collections def add_task(): return None def add_vars(): return None def add_handl ...