00:00
我们看一下原型模式在spring框架中的使用。那在spring框架里面哪里用到了原型模式呢?在这里?就是在B的创建里边,它就用到了原型模式。我们来看一段代码。比如说。我们有一段spring代码,里面有一个BS上面文件。它里面有这么一个配置,大家发现有这么一个配置。这个配置呢,这儿可以写个class,就是代表你要对哪一个类进行一个创建一个B,创建一个B,那么这边有个scope scope这边你可以去配是一个单立的还是一个圆形的,对不对。那proto呢,就是代表我每创建一个我,我就说我配置这么一个病呢,就代表它是以原型模式来创建的。对吧,那么我们把这段代码呢,给大家来运行一下。同学们看,在这里呢,我创建了一个项目叫spring,那后边我们如果对spring源码进行一个debug或者去查看的话呢,我们就写到这里,这里面呢,我已经写了一个,并因为时间关系,我已经准备好了。
01:15
这个病呢是个monster OK,这个monster有ID,有的一个昵称,有它的一个技巧,比如说牛魔王,牛魔王,牛魔王的他的他最厉害的本事是什么呢?芭蕉扇对吧,他芭蕉扇一吹,把你吹跑了。OK,那同学们可以看到,这里面呢,就是一个病,那我在病死点差文件里面呢,我这里配了一个这样的东西,大家可以看到。这配了,那这里呢,我是以原型模式来配置的一个病。对吧,这里这里我们的scope。是一个prototype,即即什么呢?原型模式,原型模式来创建。
02:02
好的,那同学们可以看到,如果我在这里去按照这个ID获取的话呢,我们来看看是不是就可以拿到来这一个,我们这写一个prototype。原型模式。的一个测三力。那这段代码呢,我时间的关系我就不写了,因为我在这已经准备好了,大家看一下,我相信学过spring的同学都应该能够看懂,把代码简单的给大家整理一下,同学们看。我在这里呢,创建了一个application contact。这里我指定去获取并点查文件,然后呢,通过这个application contact对象get病,这个get病后面我填了一个ID,这个ID呢,同学们可以看到。就这个ID对吧,OK,那这个ID,我通过这个ID呢,可以获取到一个病。获取到一个病,这个病的信息就可以输出来,那如果说我在这里再获取一次病。
03:05
我还以这个来获取,因为它是按原型方式来获取的,请问这两个病是不是同一个,或者说这两个病他们。他们是它们是同一个对象还是不同的对象,我们可以测一下来走一个。那这时候呢,我们这样来测试定。等于双等号B2。如果按照原型模式来创建的话呢,它是false,就说这两个对象不是同一个对象是吧。好的,那现在呢,我们来输出,我们来运行一下这个代码,同样这个下面我们也来输出。因为这个病呢,我已经把它重写了,对不对,大家看,因为在这个monster同学们可以看到monster这里面呢,我把图斯方法重写了。我们看看,因为我们看看他拿到信息跟我们这个原型的monster是否一样。
04:02
OK。好,那现在呢,我们做一个初步判断,这里面输出的信息应该是输出什么呢?输出的信息就应该是我这里最这个原型。的模式是这个属性对不对,那这里面应该是牛魔王。等等等等,下面这个地方并二。并二输出的呢,对不对,他也应该是牛魔王这样一个信息,但是这是这个地方输出一个boss,说明他并不是同一个对象,只是属性相同而已,来各位朋友我们运行一把。运行一把。好,我们运行起来,我们可以看到,我们可以看到。第一个病的信息是原型的对象的那个属性,第二个也是,但是我们发现呢,它返回的是个boss,说明这两个病呢,只是属性相同,因为它是按原型来进行这个克隆的,但是呢,这两个对象不是同一个对象,好证明就这样子的,那现在我们来看一下这个源码。
05:07
它到底在哪个地方使用到了我们这个圆形呢?来,同学们,我在这儿下一个断点。然后呢,我们debug一下。跟上老师思路,Debug。OK。我们debug一下往里面追,追到这里呢,我们去到这个定方法里面,看它是在哪里用到了原形,往里面追一下。好,追到这里面我们发现呢,他在这里调用了这个方法,对不对,调用这个方法,然后在这里面我们我们大致可以猜的出来,它的核心方法应该是通过这个工厂。病的一个工厂得到一个病工厂,然后叫get病。好,那么我们注意到这里面去,应该才是往下来一步。往下来一步往里面追。好注意诶,直到这个地方我们发现呢,这个地方它是一个同步的,就是它获取一个病的工厂,好,我先返回。
06:03
返回过后呢,我再往里面追,就会追到get b这个方法里面去,是这样子吧,同学们追到这里面,诶,我们发现核心的代码是在do get,再往里面追。我们来到do get,我们看do get,这个方法才是最核心的,我们往下拉,在哪里可以看到。这个圆形的位置呢,大家知道。在病史这个配置文件里面,除了可以配原型,还可以备单例,还记得吧?啊,如果你不记得,那就也也无所谓哈,但是大家知道这个scope呢,可以去配置的,好,我回到这里来。画对面了。回头里面我们往下走。来一步来一步,好,同学们往下看啊,我,我就一步步的追了。追到这来往下走好,打到工厂往下走走走走走走走往下走走好,同学们可以看到它在这里呢,判断你在配置的是不是一个单立的。
07:02
Single to,显然我这张配的不是单利,于是这个衣服语句是不会进来的。因为我们不是按照单利这种模式来生成的,于是我们往下走。哎,这个时候他判断,诶,你是不是按圆形的呢,显然我这个MD它就是圆形的,看追到这里,这个MD里面它的确是按圆形来拿的,看往下走是吧,这边我们可以看到有很多信息,里面有一个信息是scope。这个scope里面这个词就是pro prototype。这个pro就是你配置的,那这显然这个L11这个代码就能进去。是不是进到这里面了,下面我就不一个看了啊,它的核心代码往下走就行了,它的核心代码是在这个create并里面。在这里面他会给你返回一个原型实例,这个实例就是我们拿到那个病老师就不往里面去追了好吗?也就是说我们可以看到的确在我们的这一个spring代码里面。
08:00
呃,配置一个病的时候呢,是用到了原型设计模式。那么核心的代码就是老师刚才追踪的这样一个过程,大家有所了解,就是说的确确确在我们spring框架里面用到了。那各位关于原型模式在spring框架里面的一个源码分析呢,老师就该了解的,那说到这里好吧。
我来说两句