00:00
好,那我们刚才呢,咱们是通过IOC容器来管理了我们当前的数据源,然后下面咱们来看一下咱们的实验室,一叫做B的作用域,那什么叫做作用欲啊,作用欲其实指的就是作用范围的意思。然后呢,我们当前咱们的每一个B呢,就是我们IOC容器中所管理的每一个B,大家注意它的作用域呢,都有一个默认的值,这个其实我们之前啊,咱们就跟大家提到过,是单例。对吧,我们之前咱们在给大家去介绍这个IOC思想的时候,咱们给大家举的例子是什么。就是一个是传统方式,我们要吃饭,那我们就得先做饭,先买菜,择菜,切菜对吧,改刀,然后咱们再去做饭,做完饭之后我们才能吃到嘴里面对吧?但是呢,在我们有了这个IOC之后,那我们是不是就可以通过点外卖的方式,然后来获得这个菜,来获得这个饭,而且我当时跟大家说的是,我说通过咱们的点外卖,咱们所获得的这个饭呢,他有的时候比我们所这个自己做的这个饭是不是要更好吃一些。
01:03
换句话来说,咱们由IOC容器所管理的这个对象啊,甚至要比我们自己创建的对象要更好一些,为什么呢?就是我们当前这个bin的作用域,那大家都知道我们在之前如果咱们学过这个,这个叫做单利模式,如果我们现在要想来获取某一个对象的唯一实例,那我们是不是就要手动的去设置一个单例模式,将我们当前这一个类。它的构造器进行私有化,然后呢,来提供一个方法,将我们当前的一个唯一的实例对象,然后将它进行返回,对不对,那这个时候我们当前能够访问到的啊,然后咱们所获取的对象,它都是一个唯一的一个对象,好,但是在我们的这个IOC所管理的并所管理的并中呢,我们在获取这个B的时候,这个bin它默认就是一个单例模式,也就是说我们通过IOC容器来获取一个bin的时候,你所获取的对象它都是同一个对象,OK吧,那我们下面咱们可以来验证一下,大家注意啊,好,然后我们在这再创建一个配置文件,这个配置文件咱们叫什么?叫做spring,然后杠scope。
02:14
Scope就是玉的意思,OK吧,行,然后呢,比如说我们在这,咱们就来设置一个啥呀,咱们就来配置一个这个学生对象呗,然后ID等于student,然后它的class咱们等于student OK啊,这里面的属性啊,大家想写的话你就写一下,不想写的话也可以啊,如果说你想给属性复制,那咱们就一个一个写一下就可以啊,比如说咱们就给sid和S内复制,OK吧,然后这是1001OK,然后再复制,然后这个是S内,然后咱们在这给他来写个张三。好,那大家来看,那我们现在咱们这个把并创建完成之后呢,咱们的依赖注入呢,咱们也已经设置完了,那下面呢,我们就可以写个测试类来测试一下,这个咱们叫做scope test OK,然后来写一个unit的方法,Public word叫做test scope。好,那我们这个要做的事情呢,是一样的,首先咱们也是因为我们要验证的是spring的IOC容器所管理的并默认是单例模式,那所以说我们首先是不是就要来获取IOC容器。
03:27
它等于六一个class pass XL application conest,把我们当前的配置文件呢,Spring杠,Scope,然后把它拿过来,然后下面呢,咱们是不是就可以通过IOC来获取咱们的B了,怎么来获取呢?咱们说了以后用的比较多的方式就是通过类型来获取,所以说咱们在当前咱们的这个配置文件中,是不是就只有一个student类型的病呢?那所以咱们直接通过类型来获取就可以啊。好,然后呢,大家来看,那我们在这咱们先获取第一个叫studentone,咱们在这儿再获取第二个叫student to,我们现在是通过同一个IOC容器,然后来获取了我们当前的这个B所对应的对象,我这是我们第一次获取,这是咱们第二次获取,那我们在这咱们所获取的这两个对象它一样吗?
04:17
大家想一下,你在这输出这个内存地址肯定不行啊,你输出这个内存地址的话,因为我们重写了to string,所以说你看到的是to string之后的结果知道吧,所以说我们怎么判断,大家注意你要想来判断它是不是同一个对象,我们是不是可以通过ES来判断。点ES或者说大家用什么恒等来判断也是可以的,对不对,因为这个恒等啊和这个点ES,它默认情况下它的功能是一样的,都是干什么来比较内存地址对吧,但是对于我们的一些比较特殊的类,你重写了equals的一些。类型的话,那它可能比较的就不是内存地址了,就比如说我们大家所熟知的应该就是一个string类型,字符串类型,然后字符串类型中的to string啊,这个E口方法就被进行了重写,它比较的是内存地址,不是不是,它比较的是一个什么呀,比较的是一个内容。
05:14
对吧,为什么?因为它比较内存地是没有意义啊,因为咱们的字符串它的本质是一个常量,那常量它是存储在我们的常量池中的,对吧?然后每一次我们再给一个字符串类型的变量赋值的时候,它都是怎么来赋值的,先在咱们的常量池里面找一下,看有没有,如果有则直接用,没有的话才会开辟空间。来创建咱们当前这个常量对不对?那所以说大家想想,如果你当前你的S1等于哈,S2也等于哈,那我们有没有必要去比较S1和S2的内存地址呀,没有必要,因为你所对应的这个哈啊,它一定是我们常量池里面的同一个常量知道吧,所以说咱们的string string这个类它的E口的方法就被进行了重写啊,然后它比较的是内容,好,那我们现在呢,咱们就通过恒等来比较一下,看它的内存地址是否一致,如果一致的话,那就说明咱们当前通过IOC容器所获取的我们当前的这个B所对应的对象,它默认就是单例,OK吧,好,现在咱们来一个执行,大家来看啊。
06:25
好,大家看直接就是处,那所以说它默认情况下是不是就是单立模式呀,对不对,那如果我现在我不想来实现单立,对吧,那我有没有必要我在这个地方再去配置一个病,大家说有没有必要啊,咱们之前就跟大家说过这个问题,你配置两个病,你是想通过每一个病来获取一个不一样的对象吗?那如果要是这样的话,那我们当前咱们的bin标签里面直接就有一个属性,叫做scope的属性,它的默认值是single,然后singleten就是单例的意思,如果我们把它设置为proty,大家注意这个就是多例原型。
07:04
原型不就是多例吗?我们去创建一个类对应的实例化对象,那咱们每创建一次不都是一个新的对象吗?对不对?所以说大家注意这个叫多例,Singleten叫单例,比如说咱们先试它,然后我们来看一下,当你不设置和你设置为singleten的时候,大家看是不是都是除,对不对?好,那我们再来测试咱们的这个值叫做pro type,大家注意这个叫多立,我们现在咱们再来进行测试,大家来看一下啊,你看在这就变成false了,那说明我们当前设置了这个属性,把它设置为pro type之后,我们通过这个并来所来,然后所获取的对象,它是同一个对象吗?不是,我们每一次来获取它都是一个新的对象,OK吧,好啊,行,那这个是我们当前咱们B的作用域,咱们在这呢,给它写一下,大家注意啊好,然后咱们的scope,然后来设置谁来设置B的作用域,OK,然后那咱们的。
08:05
Scope它一共有几个值呀,大家注意,它其实有有四个值,我们在这咱们能看到的啊,然后呢,是两个值,好比如说在这大家来看咱们这个把single,然后写进来,然后还有一个叫什么叫做proty啊叫然后这个呢,表示的是多例啊,咱们主要来讲这两个,一会咱们再去看咱们的文档上,文档上还有两个啊,那single这东西来表示什么?大家注意,然后表示咱们来获取B啊,表示咱们来获取该变所对应的对象,该变所对应的对象都是同一个,哎,然后其实就是单立的意思啊,在这咱们加个括号叫做单立,好然后呢,我们在这这个值是什么意思,大家注意,这个值是多利的意思,好然后表示咱们获取该B所对应的对象,它都不是同一个,都不是同一个,也就是说它都是。
09:05
一个新的对象,OK吧,好,这个大家要看好啊,那其实我们这两个值,咱们哪一个用的比较多,大家注意,其实我们用的比较多的就是单例,只有我们在一些比较特殊的情况下,我们才会专门去把它给设置为多利,OK吧,好这个呢,嗯,比如说咱们原来呢,咱们有这个TRUT2这个项目,TT2这个框架,当然现在它已经被淘汰了啊,咱们在TRUT2里面,它的一个处理请求和响应的这个action,咱们就必须要把它设置为多例。这个大家注意啊,好,然后为什么呢?我简单给大家介绍一下啊,因为在咱们的STRUCTURE2里面呢,然后我们的这个处理请求和响应的这一层,它咱们一般都叫做它action,好然后这里面咱们会去设置一些成员变量,然后比如说咱们在这有一个成员变量是U的啊,U的类型的一个成员变量,然后我们会为它来设置set跟get方法,哎,然后它的方法是用来干什么的呢?大家注意啊,它的set方法,然后是用来收集我们浏览器传输过来的请求参数的,然后它的get方法,然后是把咱们当前的这个成员变量呢,共享在咱们的请求域中的,好那所以说这个时候问题就来了,什么问题,比如说我们现在咱们把这个action交给咱们的spring的IOC管理之后,那它默认也是单立的。
10:30
也就是说咱们用的同咱们用的永远都是同一个对象,知道吧,好,那比如说我们现在咱们先实现了一个功能叫什么叫修改功能,那修改功能咱们就要把这些用户信息啊,然后把它给提交到我们当前的服务器里面,由咱们的action中的user来进行获取。它是通过它是怎么来获取的呢?我说的它就是通过set方法来获取的,然后它会把咱们浏览器传输过来的各个用户信息,通过set方法,然后赋值给U中的各个属性,那大家说修改它是不是有IDID是不是有值的呀?那所以说咱们当前这个U里面它的ID就有池了,我把修改功能做完之后,然后比如说我下面紧接着又做了一个什么叫做添加功能,那添加功能大家都知道,我们仍然是要把这些数据提交到咱们的服务器中。
11:23
那对应着咱们的action,我们也是要通过这个优点来收集咱们添加的这些数据的,对吧?好,但是你要注意你的添加功能它是没有ID的,但是我们现在咱们所操作的action是被spring管理了,那所以我们所获取的action它都是同一个呀,那大家说你上一次修改操作的时候,咱们的这个你在执行修改功能的时候,我们X里面的user,它这里面的ID是不是就有值了,那我们现在咱们通过添加实现添加功能的时候,你所访问的还是这同一个action,那大家说这个时候的user里面的ID是不是也有值呀?
12:01
对不对?好,所以说大家注意,这个时候咱们的添加你传过来的是什么数据对吧,然后它就会为我们当前U的里面的各个属性来赋值,但是咱们的添加页面中肯定是没有ID的,所以说这个时候这个user里面的ID就不会被覆盖,那它用的还是我们之前修改功能里面的ID,知道吧,好,所以说大家看好,那我们。咱们之前是用的SSH整合我们的持久层框架,咱们用的是harber net,那我们在实现添加和修改的时候,大家注意用的是第一个方法,知道吧,Harberate里面修改跟添加用的是同一个方法,叫什么叫做save or update。叫做save or update,也就是说这个方法既能实现添加,又能实现修改,什么时候实现添加?听好啊,你所传输过来的这个user对象,也就是实体类对象,如果说它的ID没有值,就是添加。
13:01
如果你传输过来的优对象,它的ID有值,就是修改。那这就完了,你会发现你实现了一次修改功能之后这个优点,因为咱们当前的action是交给IOC管理的,所以说咱们用的action永远都是同一个,那所以这个时候你的U里面的ID,它永远都执行完修改功能之后,它永远都有值,所以说大家记好,你先实现修改,再实现添加,你的添加就再也不好使了,然后从此之后你的添加将全部都变成修改功能。是这样的啊。好,这个大家注意,这个当然咱们现在也用不到了,是不是啊,咱们现在这个框架已经被淘汰了啊,所以说大家先听一下就行,咱们确实是有的地方需要用到这个多利的,但是咱们大部分情况下用单例就可以啊,行,那下面呢,我们再来看咱们的文档,大家注意,然后呢,咱们的scope这个值其实还有两个,它还有什么呢?在我们的web application contest环境下,也就是说在我们的we部应用中呢,咱们的这个B呢,然后它还有两个值,一个叫request,一个叫session,不常用,大家注意request是什么意思啊。
14:11
我们当前咱们的这个对象在一次请求中有效,Session表示当前的对象在一次会话中有效,是这样的。好,那行,那这是咱们B的一个作用域,大家要知道它默认是单例,叫single,然后呢,咱们如果要把它设置为多例,很简单,你不需要去在IOC中去配置这个类型的多个B,咱们只需要去改一下scope属性值,改为pro就可以啊,行,OK。
我来说两句