文档章节

Spring探索: IOC容器的实现 一

玄影镜心
 玄影镜心
发布于 2016/12/15 16:07
字数 1371
阅读 71
收藏 0

零:认识BeanDefinition

    在面向对象程序设计中,我们以"对象"来作为问题空间与解空间中一对一映射关系的抽象。BeanDefinition类就是ioc容器中,对依赖反转模式中管理的对象之间依赖关系的数据抽象,简单来说:它抽象了spring对Bean的定义,用来管理基于spring的应用中的各种对象,以及对象之间的相互依赖关系。

一:BeanFactory接口清单

BeanFactory定义了IOC容器的最基本形式,提供了IOC容器应该遵循的最基本服务契约。

getBean 方法是ioc容器的主要方法,可以获取ioc容器中管理的Bean

containsBean 判断容器中是否含有指定name的bean

isSinglton 查询指定name的bean是否为单例模式

isPrototype 查询指定name的bean是否为原型模式(多实例)

                (isSinglton和isPrototype可以在BeanDefinition中通过setScope来指定)

isTypeMatch 查询指定name的Bean的class类型是否与特定的class类型匹配

getType 查询指定name的bean的class类型

getAliases 查询指定name的Bean的所有别名(返回string[]),别名可以通过BeanDefinition定义

-----------------------------------------------------------------------------------------------------

二:XmlBeanFactory

XmlBeanFactory是一个可以读取以xml文件方式定义的BeanDefinition的ioc容器

在xmlBeanFactory中初始化一个XmlBeanDefinitionReader对象,用它来处理以xml方式定义的BeanDefinition,xmlBeanFactory并不直接参与处理。

xmlBeanFactory的构造器中,我们可以看到Resourse对象,Resourse对象是spring用来封装io操作的类,在此它为xmlBeanFactory指定了XmlBeanDefinitionReader的信息来源。

XmlBeanFactory继承自DefaultListableBeanFactoryspring把DefaultListableBeanFactory作为一个默认的功能完整的ioc容器来使用,它实际包含了基本ioc容器所具有的重要功能。xmlBeanFactory在其基础上扩展出了处理xml信息的方法。

 从这个我们可以看到ioc容器使用的基本过程应该是:

1:创建ioc配置文件的抽象资源。(包含BeanDefinition)

2:创建一个BeanFactory。

3:创建一个载入BeanDefinition的读取器(如XmlBeanDefinitionReader),并通过回调配置给BeanFactory。

4:讲定义好的资源位置读入配置信息,具体的解析过程由具体的读取器来完成。完成载入和注册bean信息后,就可以通过ioc容器直接使用了。

-----------------------------------------------------------------------------------------------------

三:ApplicationContext

ApplicationContext在BeanFactory的基础上添加了更多功能,可以说是一个高级形态的ioc容器,也是我们最常用的。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...}

ApplicationContext增加的特性:

    1:支持不同的信息源。从上面代码中可以看到,ApplicationContext扩展了MessageSource接口,这些信息源的扩展功能可以支持国际化的实现,为开发多语言版本应用提供服务。

    2:访问资源。我们可以从不同的地方得到Bean定义资源,尤其是从不同的I/O途径获得Bean的定义信息。这一特性体现在对ResourceLoader和Resource的支持上。(ApplicationContext接口的实现类都继承了DefaultResourceLoader)

    3:支持应用事件。继承ApplicationEventPublisher接口,该接口在上下文中引入了事件机制,为Bean的管理提供便利。

    4:其他附加的服务。

ApplicationContext容器的设计原理

我们在研究applicationContext设计原理时,以实现类FileSystemXmlApplicationContext为例。

public class FileSystemXmlApplicationContext extends AbstractXmlApplicationContext {...}

上图可以看到:FileSystemXmlApplicationContext中只包含了与它自身设计相关的两项功能,而其他功能都已经由他的父类AbstractXmlApplicationContext实现了。

	public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {

		super(parent);
		setConfigLocations(configLocations);
		if (refresh) {
			refresh();
		}
	}

第一个功能:在FileSystemXmlApplicationContext的构造器中,调用了启动ioc容器的refresh() 方法,这个方法牵扯到ioc容器启动的一系列复杂动作,同时,对于不同的容器实现这些动作都是类似的,所以在基类(AbstractApplicationContext)中将他们封装好,此处仅进行调用。

@Override
	protected Resource getResourceByPath(String path) {
		if (path != null && path.startsWith("/")) {
			path = path.substring(1);
		}
		return new FileSystemResource(path);
	}

另一个功能:实现了从文件系统中加载xml的Bean定义资源。这部分是他设计的具体相关内容。通过他可以为读取xml文件上保存的BeanDefinition做准备(仅是做准备,并非直接处理,因为不同的应用上下文实现对应着不同的读取beanDefinition方式),此处仅得到FileSystemResourse定位资源。

总结:

                1:顶层(相对顶层)接口定义通用契约

                 2:其他分支接口对顶层契约进行扩展,

                 3:用抽象类实现接口,对接口方法进行部分实现(也可全部实现,根据需求判断)。此时,若这个抽象类的具有多个子类,则可以把子类间存在分歧的部分写成抽象方法。而多个子类中相同的部分则集中由这个抽象类来进行实现。(如果仅仅只有一个子类,那么并不需要抽象类来对接口进行过滤,可以直接用一个类来实现接口,但是考虑到系统扩展的可能性,仍然建议这样做。)

                4:抽象类的子类,仅仅定义与其功能设计相关的部分,但并不对相关功能进行实现,实现功能的动作被分配到其他执行者中。(因为可能会有多种不同的执行者)

© 著作权归作者所有

玄影镜心
粉丝 9
博文 103
码字总数 53409
作品 0
西安
高级程序员
私信 提问
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
2018/08/27
0
0
SpringBoot的幕后推手...

一、背景   这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开...

Java工程师-Distance
2018/06/01
117
0
Spring BeanFactory和FactoryBean的区别

有些东西可能知其用,但也需知其所以然,特转载该篇Spring BeanFactory和FactoryBean的区别 及 包是 Spring IoC 容器的基础。 一、BeanFactory 定义了IOC容器的最基本形式,并提供了IOC容器应...

淡淡的倔强
2018/09/07
0
0
深入理解Spring源码(一)-IOC容器的定位,载入,注册

前言:Spring源码继承,嵌套层次非常多,读起来非常容易晕,小伙伴们在看文章的时候一定要跟着文章的思路自己去源码里点一点,看一看,并且多看几次。就会越来越清晰。下面开始正题 1.Spring...

Meet相识_bfa5
2018/05/01
0
0
Spring应用学习——IOC

Spring简介 1. Spring的出现是为了取代EJB(Enterprise JavaBean)的臃肿、低效、脱离现实的缺点。Spring致力于J2EE应用的各层(表现层、业务层、持久层)的解决方案,Spring是企业应用开发的...

江左煤郎
2018/11/16
39
0

没有更多内容

加载失败,请刷新页面

加载更多

JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
5
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部