深入理解Spring核心技术---IOC实现原理

前面的几篇博客中给大家提到了Spring 框架的两个核心的技术,IOC和AOP。相信大家现在对Spring有了一定的认识,Spring的出现就是为了简化开发。现在就来聊聊Spring中IOC容器的实现原理。
在进入话题之前我们需要先来回顾一下Java中的反射,相信大家对反射都不陌生吧,那么什么是反射呢?大家只需要知道它是一种机制,该机制的作用是动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
所谓的动态指的就是在程序运行的时候。可能有点不好理解,Class类大家应该都知道吧。我们在使用原生的JDBC连接数据库的时候就是使用反射来加载数据库驱动的,大家应该都比较了解了吧,同样的Spring中其实就是 通过反射来读取配置文件的。
好了,回顾了一下反射之后我们就来聊聊工厂模式,那么什么是工厂模式呢?先来看一下这张图:在这里插入图片描述
这张图之前又给大家划过,所谓工厂就是用来创建对象的容器,工厂模式就是创建对象并把对象存储在容器中的一段程序代码。这段程序代码经过前辈们不断的优化和改进,逐渐形成的一个模板,这个模板就叫做工厂模式。
好了,下面通过一个小demo来演示一下工厂模式,打开eclipse,创建一个名为factory的工程,包结构如下图所示:在这里插入图片描述
同时创建上图中的类,其中bean.properties文件是一个配置文件,内容如下图所示:在这里插入图片描述
首先来编写service层下的SpringDemoService接口,在该接口中定义一个success方法,如下图所示:
在这里插入图片描述

接着创建给接口的实现类SpringDemoServiceImpl,实现SpringDemoService中的success,这里为了方便演示效果就只编写了一条打印语句,如下图所示:
在这里插入图片描述

好了,做完了Service层的工作后我们就需要来重点关注factory包下的Bean Factory类了,这里该类的具体贴出代码:
这段代码相对于来说比较重要的,大家最好自己手动的敲一遍,因此给出截图:
在这里插入图片描述
在这里插入图片描述

好了,大家可以看到上述截图中首先定义了一个Map集合,该集合就是用来存放某个类的全名,通过读取bean.properties文件来加载具体类的路径,将key依次读取出来存放在Map中,然后根据key来取出value的值,一个value的值对应的就是一个类的全名,通过该类的全名利用反射来创建该类的对象。大家可以观察到第34行代码,
在这里插入图片描述

这行代码就是通过反射来加载类的路径来创建对象的,在Class类中有一个newInstance方法,该方法就是用于创建一个该类的对象,这里给出api文档中的解释:
在这里插入图片描述

接着我们来看看getBean方法,该方法中只有一条return语句。我们知道beans是HashMap的一个实例的应用,那么我们先来打开HashMap的源码,找到get方法,如下图所示:
在这里插入图片描述

大家可以看到,get方法其实就是根据传入的一个key返回集合中key对应的value。好了,到了这里大家都应该明白的差不多了吧。
既然工厂已经写好了那么就来创建一个测试类吧,好了,Client类的具体代码如下:
在这里插入图片描述

首先在main方法中声明一个SpringDemoService的引用,该引用指向BeanFactory的getBean方法返回的一个实例**,这里需要注意的是getBean方法返回的是一个Object类型的对象,所以这里需要做类型转换。**执行该方法可以得到如下结果:
在这里插入图片描述
这里可以看出对象已经创建成功了。同时我们再来运行testFactory这个方法,可以得到一下结果:
在这里插入图片描述
从上图的结果来看,大家得到了什么结论呢??
**可以看得出来,上述5个对象的地址值是相同的,没错该工厂中每个类只提供一个对象,**关于这个就属于现成的安全问题了。这个就是对应着Spring中的Bean的作用域。在下一篇中将会给大家介绍依赖注入的相关原理。
好了,一个完整版的工厂模式的体现了,不知道大家有没有理解,没有理解也不要紧,大家只需要知道Spring底层的IOC实现原理就类似于上述的代码。
到这里相信大家对IOC已经有了比较深入的认识了吧。
**再来回忆一下IOC的作用,控制反转就是将创建对象的动作交给了容器来做,也就是说将我们创建对象的动作反转给了容器。**而我们要使用对象的时候由容器给我们提供。
好了这就是IOC的核心概念了。
下一篇博客中讲给大家介绍Spring中的DI(依赖注入)

猜你喜欢

转载自blog.csdn.net/qq_38701478/article/details/82533525