00:00
好,那我们为什么以后咱们不会这样去用呢?大家注意以后,因为以后咱们不会有这么多特殊情况啊。你看咱们说了by tap不行,自动转换为by name by type和by name都不行,然后需要再用到第二个注解,叫做it quali file,对吧?但是以后我们真正的情况是什么?一个类型的bin,它在我们的IOC容器中,咱们只会配置一次,这个咱们不可能会配置多次,那这个时候其实我们使用默认的by tap就行了,所以说我们其实以后大家怎么去做?啊,非常简单,就是我们最开始给大家写的那种方式,我们在controller上加上咱们的控制层组件的注解,在U,在service上来加上我们当前a service注解,在Du上加上a re reporty注解,对吧?Control里面用的user service,那咱们直接一个a or to world就完事了,By type就行,因为一个类型的病,它不会在IOC容器中存在多个。OK吧,所以说咱们讲的这种情况极特殊,以后呢,会不会遇,会不会遇到呢?有可能会遇到,所以说呢,咱们如果遇到了,大家也要知道该怎么解决,但是我们99%的情况都是直接自动装配就可以,OK吧,为什么再说一遍啊,这句话跟大家说过好多好多次了,一个类型的病,咱们也不可能在IOC容器中去配置多次。
01:22
能听懂吧,这样的啊,好OK,那咱们在这呢,咱们再来说一种比较特殊的情况啊,又是一种特殊情况,什么特殊情况,就是你在IOC容器中啊,没有任何一个类型匹配的B,咱们刚才说的是有多个类型匹配的B,那如果说一个类型匹配的B都没有的话,它会出现什么情况呢?大家还记不记得我们在之前,然后我们这个给大家讲的基于叉L的自动装配的时候,对吧?如果没有类型匹配的B,如果咱们用的是by tap,而在我们的IOC容器中没有任何一个类型匹配的B,这个时候会怎么办?大家有印象没有,是不是能装配则装配,装配不了就算了,然后我们当前咱们的属性它用的是默认值,大家还记不记得。
02:09
然后咱们是不是在这个基于叉L的自动装配的时候,看到过好多次这个空指针异常。有印象没有,应该有吧,好所友说,在基于叉L的自动装配中,如果你的by tap没有找到类型匹配的B,那它效果是什么?不装配来使用当前属性的默认值,那我们当前呢?大家看一下我们现在啊,比如说我把这两个给它注释掉。好,然后呢,我们在control里面,咱们把这个注解呢,也给它注释掉,也给它注释掉,对吧,然后在我们的service里面把这个注解呢也注释掉,这就是我们以后最最经常用的方式,知道吧,那我们大家来看一下啊,直接自动装配就完事了,因为我们的IOC容器中,现在这个类型匹配的病只有这一个,大家看一下是不是好,那如果我现在连一个类型匹配的病都没有呢,比如说我在这我这个注解我。
03:04
就忘了对吧,我没有再从咱们的service上来加上这个it service注解,那这个时候怎么办,大家看啊,这个时候他报的错是什么。啊,之前咱们在基于叉L的自动装配的时候再说一遍啊,它是能装配的,装配装配不了的话,使用属性的默认值,但是我们现在来一个执行大家看啊。直接报错,报的是控指针,不是不是报的是什么错呢?你往下找,咱们说了有。多个错,从下往上看。这个错叫什么?No such病DeFinition exception什么意思?没有足够的病被发现异常。哎,大家看跟咱们之前基于XL的自动装配不太一样吧,之前咱们这个应该是直接使用属性的默认值,就是耐,然后咱们看到的错应该是空指针,当然在这是空指针吗?不是好,那为什么会出现这个问题,大家看啊,那是因为啊,它给咱们的提示,他说我们当前咱们的这个没有任何一个user service类型的病可用,好然后我们当前咱们至少得有一个病,大家看一下at least对吧,至少得有一个B对吧,然后能够来完成咱们自动装配的效果,然后现在我们所依赖的这个注解是谁呀?是咱们的auto well的这个注解。
04:27
然后呢,咱们依依赖的是这个注解里面的哪个属性呢?叫required等于除什么意思,也就是说导致我们当前出错的这个原因是因为咱们的auto well的这个注解里面有个属性,Required是必须的意思,默认值是处,也就是说必须完成自动装配,不完成自动装配的话直接报错。好,这个大家注意,那所以说遇到这种情况的话,大家注意这也是一种特殊情况啊,然后呢,那既然大家看一下,在这咱们有个require的属性,默认为出,那如果我要把它设置为force呢,那不就是不是必须进行自动装配吗?那这个时候大家想一下,那它就它,那它就会有什么样的一个效果呢?咱们在这写一下叫做required,咱们给它等于false,来下面大家看啊,我现在再来一个执行,大家看一下。
05:19
好,然后大家看空指针对不对,是不是又变成空指针了,所以说为什么咱们会报no such being DeFinition exception,那是因为啊,我们当前咱们在我们的IOC容器中啊,没有类,没有任何一个类型匹配的B,而我们用注解实现的自动装配呢,然后它里面有一个属性是要求我们必须完成自动装配的,所以说如果完不成,他报的就是我们。这个spring中的错,而如果我把它设置为false的话,大家都知道,其实这个东西它没有任何意义,你把它设置为false能怎么样,对吧?然后这个时候呢,当前的属性是默认值,那我们去使用这个属性,那大家看一下它是不是直接就是空指针呀,对不对,所以说这个大家看好,这个东西咱们以后用的也不多,但是呢,咱们既然说到这个问题,咱们就把它的所有的特殊情况都说一下啊。
06:13
好。OK,好,那所以这也说明了一个问题啊,什么问题呢?比如说我们在这,咱们再加上一个注解,大家来看我现在我来一个执行之后啊,然后大家再来看咱们报的这个错,然后如果大家以后你看到了这个错,大家要知道他是什么问题造成的。知道吧,它是什么问题造成的啊,然后呢,我们当前如果你看到这个错的话,那它一定是我们当前咱们的自动装配,然后没有任何一个类型的B能够为当前的属性扶持,也就是说在通过by type来进行自动装配的过程中,你没有找到任何一个类型匹配的B,对吧?好,所以大家以后看到这个错,你要知道是什么原因,那大家也,那大家也要知道我们当前要如何去解决啊,你如果碰到这个问题的话,那你就去,那你就看他给你提示出来的是什么类型的病。
07:06
对吧,那既然是user service类型的B,那就那就是什么,那就是什么问题啊,IOC容器中是不是没有一个类型匹配的,并跟他赋值呀,对吧?那我们应该去找谁找到user service的实现类,你看看这上面有没有加注解,如果没有加注解,那就是没有注解的问题,OK吧,如果有注解,那大家注意它就一定是扫描的问题,那就肯定是我们在扫描的时候没有扫描到我们当前的这个类,它不可能会有其他的问题的,所以说大家以后只要看到这个错,就是咱们自动装配的这个错,看到这一疙瘩对吧?然后大家一定要注意,它就是自动装配的过程中没有找到任何一个类型匹配的病,哪一个类型匹配的病就是它。对吧,所以说大家来找到它的实现类,然后你看一下有没有加注解,要么就是注解的问题,要么就是扫描的问题,不可能会是其他的问题,OK吧,好,这个大家注意啊,那我们在这给大家写一下好。
08:06
这个注意对吧,然后我们这个若IOC容器中啊,然后没有任何一个类型匹配的病好,然后此时此时。此时对吧,然后也是抛出异常嘛,对不对,抛什么异常,No such being DeFinition exception。OK吧,好,大家注意,然后为什么会出现这个异常啊,在咱们的a o to。Out to well的注解中,然后有个什么属性叫什么属性,大家注意required对吧?然后默认值,默认值为TR有一处对吧?要求什么要求必须完成自动装配。能看懂吧,哎,行好,然后咱们可以将啊,然后record,然后设置为什么设置为false啊,设置为FA,设置为false,好,然后此时就是能装配啊,能装配则装配。
09:18
好,然后无法装配,无法装配,然后则使用默认值,则使用属性,属性的默认值OK啊,但是大家注意,这东西咱们用的不多啊,其实咱们以后没有那么多特殊情况,再给大家说一遍,我们以后咱们用的最多的情况就是直接把我们当前的各个组件通过注解加扫描来管理B,然后在我们当前咱们的这个对象里面,在我们当前的这个类里面,然后直接来为我们当前的成员变量来加上it out well的注解就完事了。没有那么多特殊情况,知道吧,为什么啊,还是那句话,一个类型所对应的bin,它不可能在IOC容器中设置多个。
10:03
OK吧,行,这是我们以后咱们所使用的方式啊。
我来说两句