Spring源码分析之IOC原理
简介
Spring作为各个大厂面试必问问题,对其了解是必不可少,本文内容是本文在学习Spring的一些总结。本文是SpringIOC文章第一篇,主要介绍IOC各个基础模块与基本概念。
什么是IOC?
IOC 英文名字为“控制反转”(Inversion Of control),又称依赖注入(Dependency Injection),这里借用百度百科的描述来解释“Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。”
从两个问题切入:
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。”
Spring IOC主要类图,如下:
该图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IOC 体系中大部分的核心类和接口。 下面我们就针对这个图进行简单的拆分和补充说明。 Resource体系 Resource,对资源的抽象,它的每一个实现类都代表了一种资源的访问策略,如ClasspathResource 、 URLResource ,FileSystemResource 等。
有了资源,就应该有资源加载,Spring 利用 ResourceLoader 来进行统一资源加载,类图如下:
BeanFactory 体系 BeanFactory 是一个非常纯粹的 bean 容器,它是 IOC 必备的数据结构,其中 BeanDefinition 是她的基本结构,它内部维护着一个 BeanDefinition map ,并可根据 BeanDefinition 的描述进行 bean 的创建和管理。
BeanFacoty 有三个直接子类 ListableBeanFactory
、HierarchicalBeanFactory
和 AutowireCapableBeanFactory
,DefaultListableBeanFactory
为最终默认实现,它实现了所有接口。 Beandefinition 体系 BeanDefinition 用来描述 Spring 中的 Bean 对象。BeandefinitionReader体系 BeanDefinitionReader 的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构:BeanDefinition。
ApplicationContext体系 这个就是大名鼎鼎的 Spring 容器,它叫做应用上下文,与我们应用息息相关,她继承 BeanFactory,所以它是 BeanFactory 的扩展升级版,如果BeanFactory 是屌丝的话,那么 ApplicationContext 则是名副其实的高富帅。由于 ApplicationContext 的结构就决定了它与 BeanFactory 的不同,其主要区别有: 1. 继承 MessageSource,提供国际化的标准访问策略。 2. 继承 ApplicationEventPublisher ,提供强大的事件机制。 3. 扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源。 4. 对 Web 应用的支持。 下图来源:https://blog.csdn.net/yujin753/article/details/47043143
上面五个体系可以说是 Spring IoC 中最核心的部分,后面博文也是针对这五个部分进行源码分析。其实 IoC 咋一看还是挺简单的,无非就是将配置文件(暂且认为是 xml 文件)进行解析(分析 xml 谁不会啊),然后放到一个 Map 里面就差不多了,初看有道理,其实要面临的问题还是有很多的。
注:文中内容总结自互联网,目的是总结相关知识,如有侵权联系作者进行删除。