首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自己实现Spring

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180422G1BYTD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券