欢迎光临散文网 会员登陆 & 注册

02-Spring源码的准备工作:Spring的简单使用和原理分析

2023-06-09 10:56 作者:儒猿课堂  | 我要投稿

开篇


上一节,我们已经将Spring源码的环境准备好了,为了方便我们入手分析Spring的源码,我们先来简单使用并了解下Spring的基本原理,这一节的内容主要分为以下几个部分:

1.首先通过一个案例,简单来使用下Spring最基础的容器XmlBeanFactory

2.然后再对比下Spring基础容器XmlBeanFactory和Spring高级容器ApplicationContext

3.最后呢,我们再分析下Spring的工作原理是怎样的,先初步了解一下这个过程


Spring基础容器XmlBeanFactory的简单使用

为了方便大家理解,我们先从一个最简单的demo开始,作为Spring源码分析的入口,首先,我们在IDEA中创建一个简单的Maven工程,引入如下依赖:

因为我们暂时只研究Spring容器模块的源码,初步引入spring-context模块的依赖就足够了。

大家或多或少都听说过,Spring其实就是一个容器,容器中装的就是一个个的bean,bean其实不需要特别的复杂,毕竟Spring的初衷就是想要让bean成为一个简单的java对象,比如,我们可以创建一个Student类作为Spring的bean:

Student这个bean创建好之后,又该如何添加到Spring容器中呢?我们可以在resources目录下,创建一个xml文件applicationContext.xml,然后在applicationContext.xml中通过bean标签配置Student类:

可以看到,通过bean标签中的class属性,我们配置了Student类的全限定名,而id属性的值就是告诉Spring容器这个bean名称是什么,方便后续从Spring容器中获取这个bean。

现在bean已经准备好了,并且已经配置到xml文件中了,这个时候我们就需要扫描xml文件,将xml文件中配置好的bean也就是Student类,给加载到Spring容器中:

可以看到,首先我们通过ClassPathResource封装了applicationContext.xml配置文件,然后将ClassPathResource作为XmlBeanFactory的构造方法的参数创建XmlBeanFactory,XmlBeanFactory可以理解为就是Spring的容器,是用来存放bean的地方。

接着,我们从XmlBeanFactory容器中,获取名称为 student的bean,运行一下就可以在控制台上打印出字符串“ruyuan ”,Spring容器XmlBeanFactory最基础的使用也就是这样了。


XmlBeanFactory和ApplicationContext的对比


XmlBeanFactory大家可能会觉得比较陌生,毕竟我们在公司开发的过程中,一般都是以ApplicationContext作为Spring的容器,大家暂时可以将XmlBeanFactory理解为是一个基础的Spring容器,它功能比较简单,而ApplicationContext相比于XmlBeanFactory而言算是一个高级的容器了。

ApplicationContext在XmlBeanFactory的基础上,添加了非常多的扩展功能和特性,所以,为了方便我们分析Spring的核心源码,我们当然要先从更基础、更简单的容器XmlBeanFactory开始研究了,当我们了解了XmlBeanFactory的一些核心机制之后,后面过渡到ApplicationContext就比较简单了。

同时,可能有些同学也会问,现在我们在公司中已经使用类似@Bean、@Controller、@Service、@Repository等注解了,哪里还有人还在使用xml文件配置了,这里需要说明一下的就是,我们本专栏的源码讲解会先从Spring解析xml配置文件开始,毕竟这是Spring最原始的一套东西,很多的核心机制还是值得借鉴的。

然后,当我们把Spring基于xml配置的这一套机制搞清楚了之后,后面我们会再来单独分析Spring是如何基于注解扫描解析的,最后大家会发现,其实不管是基于xml配置的形式还是基于注解的形式,这些都只是表层的形式而已,核心逻辑都是通用的。


XmlBeanFactory的工作原理分析


最后,我们可以简单来分析下前面demo的功能,我们看下这张图:

首先,通过ClassPathResource将applicationContext.xml配置文件封装起来,我们可以知道的是,ClassPathResource肯定会从resources目录下解析配置文件,从配置文件中解析bean标签,并获取bean标签上的id属性和class属性的值。

通过class属性的值即类全限定名称,就可以通过反射创建bean,也就是创建了一个Student对象出来,然后再将Student对象放到Spring容器当中,Student对象在容器中的名称为属性id的值,Spring容器的初始化简单来说也就是干这些事。


然后,当我们调用getBean方法时就会从Spring容器中加载bean了,Spring会根据给定bean的名称到Spring容器中获取bean,比如,demo中就是通过student这个名称,从Spring容器中获取Student对象。

简单来说,Spring的核心功能就是这么回事,但是,不管是配置文件的解析,还是从Spring容器中获取bean,这每一个步骤都涉及到非常复杂的流程。

所以,接下来我们会以这个demo作为分析Spring源码的入口,带大家一起看下Spring源码为何如此强大以及受欢迎的,大家准备好了吗,接下来,我们即将要开始一场深度的Spring冒险之旅了。


总结


好了,今天的知识点,我们就讲到这里了,我们来总结一下吧。


第一,我们简单带大家写了一个demo,体验了一下Spring基础容器XmlBeanFactory的使用

第二,然后我们对比了XmlBeanFactory和ApplicationContext,初步了解到XmlBeanFactory是Spring中比较基础的容器,而ApplicationContext在XmlBeanFactory的基础之上又扩展了非常多的功能,算是一个高级容器了

第三,最后基于demo中的代码分析了一下XmlBeanFactory的工作原理,包括加载xml文件、解析xml中的bean标签生成相应的bean,并将bean注入到Spring容器中,最后通过getBean方法从容器中获取bean来使用


从下一节开始,我们会从ClassPathResource开始,一点点的深入到Spring的源码内部,分析里面的各种机制和流程。

02-Spring源码的准备工作:Spring的简单使用和原理分析的评论 (共 条)

分享到微博请遵守国家法律