00:00
好,那我们下面咱们来看一下获取病的三种方式,那我们之前咱们就说了,获取病的方式有很多,我们在这儿呢,咱们主要说三种,首先第一种呢,大家注意,是根据咱们当前某一个B的ID来获取,那这个时候我们获取的它的返回值是object的,这个大家注意,好,那我们其实呢,还有两种方式大家来看啊,比如说咱们在这写一下叫做获取病的三种方式,三种方式首先第一种方式叫做根据B的什么获取ID,然后来获取,好那第二种方式呢,咱们是根据什么来获取,大家注意,咱们可以根据咱们的B的类型来获取B的类型,然后获取。那比如说呀,然后我们现在呢,咱们把这个给它注释掉,然后我们下面呢,咱们在这怎么写,咱们通过IOC,然后点get b,大家看你看里面是不是有一个class对象,然后呢,名字叫做required type,就是我们所需要的类型,然后呢,我们是不是只要把我们当前咱们所需要的类型的class对象给放进去,它就可以自动从咱们的IOC容器中去匹配一个类型匹配的B,然后来进行获取,OK吧,好。
01:19
那所以说咱们在这应该写什么。叫做student class,好,然后下面呢,我们就可以获取一个student对象,大家注意,你看这个方法的返回值直接就是student类型,为什么?因为我们既然是通过类型来获取的,那我们当前所获取的对象,那一定就是我们当前这个类型的实例化对象,OK吧?好,那我们在这咱们再把它给输出,大家注意,咱们在这报的这个错,还是我们刚才把无参构造删除之后报的错,知道吧,好,大家看一下获取到了没有获取到了。OK吧,好,但是大家说有没有一种可能啊,比如说我在这设置了一个student one,然后我下面我在这又设了一个叫做student to,那大家想,那我们当前咱们的IOC容器中是不是就有两个类型匹配的病了,两个student类型的病,那我们当前通过咱们的类型来获取的时候,大家说我们获取的应该是哪一个呢?应该获取的是student one啊,还是student student to呢?大家想想。
02:25
嗯。获取的应该是他,获取的还是他呢?大家注意,咱们之前在讲my be的时候就说过一个问题,如果说我们当前遇到了一些框架中模棱两可的一些问题的话,对吧?也就是说我们也想不明白到底是哪一个的时候,这个时候框架他肯定是会给我们报错的,因为他也不知道要获取哪一个,对不对,所以说大家看好我们,现在咱们再来一个执行,大家会发现诶,他就报错了。报的是什么错呢?大家看这个异常的名字叫什么?叫做no unique bean DeFinition exception,大家看一下啊,Unique什么意思?我们之前在学习my circle的时候,咱们my circle中有一个约束叫做唯一键约束。
03:11
叫做unique key,所以说unique指的是什么意思?就是唯一的意思,他说我们当前没有一个唯一的,并被发现异常,然后我们当前咱们根据类型来获取student的student的对象,但是我们现在可用的有几个呀?有两个,一个是student one,一个是student to,所以说这个大家一定要看好,那我们现在呢,然后咱们知道是哪的问题了,所以说我们在这通过类型来获取的时候,如果IOC容器中有多个类型匹配的病,大家说咱们能获取到吗?获取不到啊,所以说在这大家看好需要注意的一个问题,注意对吧?啊,咱们写到下面啊,叫做注意,然后根据对吧,然后类型类型获取病史获取病。
04:01
并时对吧?好,然后咱们要求什么?IOC容器中啊,IOC容器中对吧,然后有且只有一个并啊,只有且只有一个类型匹配的B能看懂吧,要求IOC容器中有且只有一个类型匹配的病,那咱们刚才看到的是有两个,那如果说我们现在连一个都没有,大家再来看,比如说我把这东西给他干掉,我们现在咱们再来一个执行,然后大家看一下啊,那这个时候他又报错,他报的是什么错,他说我们当前没有足够的并被发现异常,所以说大家以后如果看到这些错误,大家也一定要知道他是什么问题造成的,然后就可以快速的来实现一个纠错的效果,所以说呢,咱们在框架里面遇到的这些错呀,因为我们之前说实话,咱们在学习Java的时候。
05:01
那我们学习tomcat,咱们学习web工程,其实里面报错的东西啊,其实不多,咱们遇到的异常也不是很多,但是咱们在框架里面遇到的异常可能会有很多,所以希望大家呢,能够能够把它给记录下来,我们以后咱们在讲某个知识点的时候呢,咱们也会把一些特殊情况给大家演示一下,然后呢,它会出现什么样的异常,出现这个异常到底是什么导致的,然后大家一定要进行一个记录,对吧?因为咱们总是会忘的嘛,对不对,然后所以说呢,你记录下来之后,等到以后再遇到这个错误了,那我们也知道该如何去解决它啊好OK,那所以在这咱们把它给写一下,要求IOC容器中有且只有一个类型匹配的B,那若一个都没有对吧?哎,若一个都没有,或者说若没有任何任何一个类型匹配的病,类型匹配的病对吧,好,然后此时。
06:01
抛出异常对吧?什么异常大家注意,叫做no such病,DeFinition exception好,那若有多个大家注意啊,若有啊,多个多个类型匹配的病,此时他抛出的异常是什么?来咱们再来看一下叫什么呀?叫做no unique b DeFinition exception来咱们把这个异常啊复制过来,然后放在咱们的笔记里面,这个大家注意,所以说以后大家看到这个错误的时候,一定要知道是因为什么,OK,那下面呢,我们再往下看来,然后我们现在呢,然后咱们的第三种方式大家注意啊,你看咱们在这呢,可以来写一下。好,然后在我们当前的IOC中呢,它有这样的一个方法,你看这是根据类型,这是根据ID,这是根据什么类型和ID来获取,能看懂吧?好,然后所以说大家注意,这个时候咱们就可以干什么,就可以在我们当前类型匹配的情况下,再通过ID来进行进一步的筛选,比如说我要来获取的是student one,对不对?然后我们当前需要获取的类型是student.class好,OK,这个时候咱们就可以获取一个student的对象,那我们现在咱们再来一个执行,大家看它还会出现问题吗?就不会了,因为咱们只要有ID,那你获取的一定是一个唯一的,OK吧,你获取的一定是一个唯一的啊。所以说我们当前咱们的第三种方式,大家看好了,是根据什么叫做根据B的ad,然后和类型来获取,好啊好根据。
07:43
B的ad和类型来获取,然后一共是这三种方式,那我们以后用的哪一种比较多,大家想想用哪个用的比较多呀?根据ID获取,根据ID获取的话,那咱们获取的类型是object,还得进行强转对不对。
08:00
根据类型来获取啊,那他要求我们IOC容器中有且只有一个类型匹配的变,那我们有没有可能说咱们的IOC容器中有多个有同一个类型的多个B呢?这个大家注意,其实呀,我们刚才咱们就跟大家说了,说过这个问题啊,首先大家注意我们以后用的最多的方式哪一种根据病的类型来获取,为什么?因为以后像这种情况很少会出现,我们在一个IOC容器中一个类型的病,其实咱们只需要配置一个。OK吧,因为咱们当前这个病,它既可以单利又可以多利,你配置两个是什么意思,你想通过这个病获取一个对象,想通过这个并获取一个新的对象,没有必要啊,我们通过一个并通过一个属性,大家看一下,在这叫scope,咱们就可以来设置它的单例和多例,这能看懂吧?那所以说大家想想你有没有必要把一个类型。然后来设置多个它所对应的B呢,没有必要啊,这个大家注意,所以说呢,咱们以后用的比较多的就是根据类型来获取,因为你记好我们当前在IOC容器中一个类型的B,我们只需要配置一次就够了啊好OK,还有一个问题大家要注意,你说咱们这个class里面你能写接口吗?啊,这个class里面我问大家,大家说能不能写接口。
09:25
能不能,能不能写一个接口的类型啊,不能吧,因为咱们说一个并对应一个对象,那你的接口类型它能直接进行实例化吗?能不能不能接口里面连构造方法都没有,它怎么来创建对象,咱们也说了,这个过程用的是什么反射,通过我们当前咱们这个类型的无参构造创建,那你想想你的接口里面它有接口里面它它有没有构造方法呀,没有吧,所以说大家注意,在咱们的class里面,大家写的只能是一个什么,你写的只能是一个具体的类型,OK吧,好啊。
10:03
然后下面呢,我们再来看咱们在这儿啊,获取病的三种方式。然后咱们需要注意的问题。根据类型获取B的时候,要求IOC容器中指定类型的B有且只能有一个。如果你配置了两个,那就不得了了,它就会直接报错,这个咱们在笔记里面给大家写的有啊,好,然后在这呢,还有一个扩展,对吧,大家注意,如果组件类咱们实现了接口,那根据咱们的接口类型可不可以来获取B呢?大家想一下,如果我们当前的组件类,什么叫组件类,就是我们当前这个交给IOC容器所管理的类,咱们说了这里面这个每一个病都叫什么叫组件,其实就是IOC所管理的对象,OK吧,好,再往下大家看,如果它实现了接口,那咱们根据接口类型可不可以来获取这个B呢?大家看好什么意思啊?比如说我现在我把这个东西咱们先给它注释掉,我现在这里面只有一个,然后我在这再来创建一个啥呀,我在这儿再来创建一个接口,比如说这个接口啊,咱们叫什么,那接口咱们叫做person,叫person。
11:17
能看懂不?然后呢,我们现在让student,然后来实现我们当前的接口,叫做employment person,行,那这个时候咱们当前的这个类型实现的接口之后,我们的笔记里面是怎么是问问的是什么问题啊,我们能否通过接口类型来获取当前的这个病,大家看一下啊,那怎么写呢?我把这个再给它注释掉,咱们来。对它进行测试对吧?然后这里面我们需要写什么,还需要写student.class或者说咱们再写一个啊来在这咱们IOC,然后点get b对吧,大家看好,给大家写两种方式,首先咱们在这student.class返回值是不是一个student呀,对不对?那我在这我把它的类型给它设置为person,大家说这样行不行?
12:08
大家想一下这样行不行,大家注意,这个一定是没有问题的,因为这个其实咱们相当于什么,并不是说你通过person类型来获取了一个币,而是我们当前通过student类型获取了B之后,把它的把咱们所获取的对象通过向上转型赋值给了它的接口对象。这个大家注意,咱们在这说的可不是这个意思,这个一定是没有问题的,知道吧,我们在这说的是什么?大家看好啊,我们在这说的是这个意思,IOc.get b里面来写的是一个person.class我们通过一个接口类型来在IOC容器中去匹配一个B来进行获取。咱们说的是这个意思啊。好,那大家说这个时候它好使不?这个时候大家想想它可不可以啊,可以知道吧,为什么呢?因为咱们现在是根据类型来找的,所以说呢,我们只要当前这个类型它能够兼容匹配就可以,也就是说我们完全可以,你我们当前在IOC容器中配置了一个变之后,你是可以通过它所继承的父类,或者说它所实现的接口,我们都可以来获取它,这个大家一定要注意,知道吧,好,因为咱们以后大部分都是面向接口编程的嘛,对不对,对吧,所以说我们以后大部分的时候都是这样去做的,是根据我们当前这个类型所实现的接口去匹配某一个BOK吧,大家来看,现在我们再来一个执行,大家看一下啊。
13:42
好,你看在这有问题没有,没有任何问题,咱们当前的这个对象获取到了没有啊,获取到了好,所以呢,大家看咱们的笔记里面可以,但是前提并是唯一的,OK吧,这咱们肯定是要唯一的,你不可能说我在这儿我提供的这一个什么这个person接口的两个实现类,那大家说你获取的当前的person对象到底由谁来实现,由咱们当前的哪一个实现类来实现呢?
14:08
对不对,所以说一定要要求bin的这个类型是唯一的啊好,那下面呢,我们再往下,如果一个接口有多个实现内,这些实现内都配置的B,然后根据接口类型可以获取吗?啊,这就是我们刚才所说的那个问题嘛,对不对,不行,因为B它不唯一,那spring也不知道要找哪一个类型,要不他也不知道我们当前需要去找到这个接口的哪一个实现类呀,对不对,所以说它就会报错,知道吧,哎,啊。啊,那所以大家来看咱们最终的结论看好了啊,非常重要,根据类型来获取病史,在满足病唯一性的前提下,其实咱们只是来看什么叫做对象instance of。指定的类型返回的结果,只要返回的结果为处,就可以认定为和类型匹配,然后能够获取到,也就是说我们当前咱们来获取的,咱们所使用的这一个,所使用的这个类型,你都可以通过哪个类型来获取这个B,当前这个类型本身的这个B本身的类型,以及这个B它所继承的类的类型,以及它所实现的接口的类型都可以,这个大家注意,来,我把这一句话复制过来啊,然后我们把它给放在这个位置。
15:28
OK。然后咱们换一个行,哎,来再换一个行,大家注意,这是我们最终得出来的一个结论啊好,然后其实他说的是什么意思结对吧,然后咱们通过咱们的病的类型,然后或或者是什么咱们的病所继承啊,病所继承的类的类型,对吧,然后还有呢,就是这个病所实现。的接口的类型对吧,然后都可以干什么都可以来获取,并能看懂吧啊都可以获取啊,并对象这样的啊好,这个问题呢,大家也一定要看好,为什么这样说啊,这个因为我说了咱们以后是要干什么面向接口编程的,其实我们以后有好多时候咱们都是根据这个接口类型来获取这个病的,知道吧,这样的啊好。
16:27
嗯,把这个星号给它删掉行啊OK,那这个问题呢,咱们就先说到这儿啊。
我来说两句