Spring 相信只要学过Java的程序员没有不知道的,Spring发展到现在现在已经到5.0版本了,已经变得非常的庞杂了,对于初级程序员来说太复杂了。今天我尝试着实现简易版本的Spring,来了解Spring其本质。
Spring的核心
Spring发展到现在已经非常复杂了,它的基本架构图如下所示:
Spring架构图
Spring架构图
从上图可以知道Spring的核心是容器管理,Spring通过容器管理不同服务的组件,为其他功能提供基础。
我们经常可以听到说Spring的两个特性:IOC(控制反转)与AOP(面向切面编程)。
IOC(控制反转)是指不主动创建对象,但描述对象的创建方式。由IOC容器管理对象之间的依赖,并负责对象的创建。
AOP(面向方面编程):它是一种编程方法,与普通的编程关注功能点不一样,它关注横切关注点,称为方面,它将那些影响多个类的行为封装到可重用的模块之中。
实现Spring
本文只实现Spring的IOC功能,即简易实现Spring的容器管理与依赖注入功能。既然要实现Spring的IOC功能:那我们首先思考几个问题:
IOC容器管理的Bean是什么?
IOC容器中的Bean从何而来?
IOC容器怎么管理Bean?
IOC容器怎么实现IOC(控制反转)?
IOC容器管理的Bean是什么?
Spring容器中管理的基础对象Bean,但Bean是什么呢?它可以看住普通对象的一种封装,容器管理的管理对象。那怎么定义这个Bean呢?下面设计一个类定义Bean的属性:
为什么设计成上面这样呢?比如构造方法只能传入className,这是为了之后IOC容器采用创建对象。
对象属性值列表采用PropertieValues对象的形式,主要是为了对属性值进行判断,因为需要对象属性添加的时候,需要防止出现重复,所以加了一层封装。
IOC容器中的Bean从何而来?
定义好了Bean,那Bean从何而来呢?传统的Spring配置是基于XML配置对Bean与Bean直接的依赖进行描述(当然也可以采用注解的方法,之后会在另外的文件进行介绍)。XML配置形如下面的描述:
当然上面class是对应项目中存在的类的全路径,id名称标识Bean对象,而中包含多种属性值,即有基本类型的属性,也有对象类型的属性,属性值为引用类型是采用ref标识。那怎么读取这样的配置文件,创建对应Bean呢?肯定得解析XML文件啊。
那怎么获取配置文件地址、读取配置并顺利解析出bean对象呢?
首先抽象一个资源类,描述配置的抽象含义
然后定义一个资源加载类,可以从配置文件路径读取文件
获取配置文件之后进行XML解析。
前面对资源的定位进行抽象,现在定义获取BeanDefine进行抽象
然后实现XML对Bean配置的解析:
IOC容器怎么管理Bean?
上面成功解析出Bean后应该讲Bean放入容器中。怎么存放,创建与使用Bean呢?首先定义一个抽象接口表示如何获取Bean。
然后定义一个抽象类管理Bean对象的获取与创建:
最后实现Bean的创建与属性注入:
IOC容器怎么实现IOC
上一节介绍了如何将Bean进行注册,如何获取Bean、创建Bean与注入属性,那么得到BeanFactory如何进行IOC呢?Spring会采用ApplicationContext来管理Bean与IOC。
首先定义ApplicationContext接口,直接继承BeanFactory接口。
然后定义实现ApplicationContext的抽象类,它内部采用BeanFacatory管理Bean容器,BeanFacatory负责Bean对象的注册、创建、属性注入、获取,而ApplicationContext在此基础上提供给开发者框架功能。BeanFacatory是Spring内部的,而ApplicationContext是Spring提供给外部使用的。
因为本文是基于XML对上下文进行配置的,所以实现对XML配置的上下文进行解析的ClassPathXmlApplicationContext类:
测试程序:
总结
本文介绍了实现Spring的核心功能——IOC容器,依次从如何定义Bean,注册Bean,管理Bean,最后如何管理IOC,基于XML配置Bean对象之间的依赖,之后会介绍采用注解的方式创建Bean对象。
github地址:https://github.com/cangqiong/my-little-spring
领取专属 10元无门槛券
私享最新 技术干货