00:00
好,那我们现在呢,已经根据咱们自己手动配置呢,然后把咱们当前的controller service,还有DA他们之间的关系呢,已经配置好了,然后我们也能够看到咱们的控制台里面给我们输出的这个保存成功对不对?好,那下面呢,我们就来看一下自动装配该如何来设置啊,首先呢,大家注意自动装配。再说一次,它是什么意思,在这给大家写一下啊。好,自动装配的意思就是根据。指定的策略。啊,有什么策略呢?咱们一会儿可以看一下,里面呢,有好几种,不过我们用的比较多的就是两种,一种叫by tap,一种叫by name啊好,它可以根据我们当前指定的策略,对吧,然后呢,在咱们IOC容器中,然后来匹配某个并啊,然后来自动自动。啊自动,然后为咱们病中的。
01:01
好大家注意,然后自动为咱们病中的这个类类型的属性,然后或是接口类型的属性,对吧,然后扶持。好,这个大家看好啊,是根据咱们指定的策略,在IOC容器中去匹配到某个病,自动为病中的类的,自动为病中的类类型的属性或接口类型的属性扶持啊,换句话来说什么意思呢?大家注意,当我们设置了自动装配之后啊,咱们的这个标签你还需要写吗?不需要,这个标签还需要写吗?不需要,咱们就不需要手动的来进行扶持了,然后我们只要配置上咱们的自动装配,它就可以自动在IOC这种容器中去找到某一个B,然后自动为当前的属性赋值,OK吧,好,OK,那这个东西咱们应该如何去配置啊?来大家看好,那当然呢,它只能针对于类类型的属性和咱们接口类型的属性,字面量类型的属性行不行呢?不行。
02:01
大家注意,因为我们为类类型的属性或接口类型属性赋值的时候,咱们用的不都是这个ref吗?那咱们只需要去找到一个对象就行,对不对?所以说这个对象呢,它没有说用这个对象或那个对象的这个情况,你只要能找到一个对象,它就能实现功能啊好,那所以说我们现在咱们把它给注释掉,然后咱们把它呢也给注释掉,那大家来看,那我们当前呢,如果说我们不做任何配置,它能自动装配吗?比如说我现在我来一个执行,大家感觉能不能,应该不能吧,对不对,因为毕竟咱们说的这东西,它得需要配置,得需要去配置它指定的策略,所以说在这如果咱们不做任何配置的话,它是没有办法来实现自动装配的,报的错是咱们的user control里面24行空指针异常,这大家都知道吧,你给成员变量赋值,那它就有值,你不给它赋值,那它肯定是默认值呀,对不对,所以说就是难啊,好,那我们该如何去。
03:02
配置呢,大家来找到我们的配置文件,在咱们的并标签中有个属性叫做auto well,叫做auto well叫做自动装配,然后这里面呢,一共有五种配置方式啊,然后呢,大家先来看前两种啊,这两种意思一样,No不自动装配。大家注意,也就是说我能匹配到B,咱们就是我压根就不自动装配,所以说我们当前就不会为当前类中这个B中的属性进行自动扶持,所以说那你不复制,那默认就是难呗,对不对,还有就是default default就相当于你不设置,你不设置的情况下,那大家刚才也都看到了,它表示的不也是不装配吗?大家说对不对,对吧,所以说这两个效果一样,比如说我们现在选择no,我们现在来一个执行,大家来看啊,看还是24行空指针异常对不对,那我们在这咱们把它给写成是depot,然后我们现在再来执行,大家来看啊。好,这个时候大家看还是24行也是控制了异常OK吧,所以说啊,大家注意这个no和咱们的default这两个,然后这两个呢,它都是表示什么呀,表示不装配的意思,那不装配的情况下,那我们当前的属性,它使用的就是默认值,OK吧,那如果你在这你给的赋值的有,比如说我们在这,咱们自己手动写死了一个,那他就用你自己赋的值,那如果我们在这没有赋值,那他就那他就默认值为蛋呗,是不是这样的啊好,那我们在笔记里面先把这两个给大家写出来,好,然后叫做自动,叫做自动自动装配的策略,哎,自动装配的策略,然后咱们现在能看到的是不是应该是有两个,哎,AU啊。
04:47
来咱们来复制一下啊,叫做auto to well对吧?好,或者说咱们这样写,然后咱们可以啊,咱们可以通过B标签中的哪个属性叫auto well属性来设置咱们自动装配的策略,OK。
05:04
策略好,然后自动的自动装配的策略都有哪些呢?咱们刚才看到了一个no,然后还看到了一个什么,还看到了一个叫做啊这个default fatut对吧,那这两个大家注意它表示什么,都表示不装配啊,不装配什么叫不装配,然后集咱们病中的属性,病中的属性,然后不会自动。啊,不会自动去匹配某个病,然后为属性赋值,为属性赋值OK吧,然后啊,此时那咱们当前的属性来使用的是什么?使用默认值,哎,这个大家注意好,那下面呢,我们再来看咱们经常用的两种,大家看好,在这呢叫什么叫做by type和by name。By typeb和by name,什么叫做by type和by name by typeb是根据类型来自动装配,然后by name是根据name属性,根据我们当前要赋值的属性的属性名来进行自动装配。
06:08
好,那我们先来看by tap来在这咱们也给它设置一个自动装配,因为service里边不有个DAO嘛,对不对,所以说咱们在这也给它选成是by tap by tap叫做根据类型,也就是说它可以根据类型呢,在IOC容器中去匹配到某一个类型匹配的病。能听懂吧,好类型匹配的B,然后这个时候它就可以将咱们的这个bin自动为我们当前的属性来进行赋值,好by tap就是根据类型,比如说这个时候咱们就不需要再做其他操作了,我在这一个执行,大家看你看它好使不好使啊看。没有任何问题,为啥?那根据类型我们要给它赋值,那大家说这个病的类型是不是跟它是能够匹配的,因为这是接口,然后这是一个实限内能匹配成功吗?可以匹配成功啊,还有就是我们当前service里面的dau,这是一个接口类型的成员变量,这是什么?这是接口所对应的实现类的对象,所以说他们两个能够类型匹配吗?匹配好这个时候咱们通过by type,然后就可以自动为当前的属性来进行扶持,OK吧,好,这个是by tap啊,大家注意非常的方便,然后它是根据类型,然后来在我们的IOC容器中去匹配到某一个B来为属性自动扶持的。来咱们在这来写一下,好,这个by tap我们以后用的是比较多的啊,By type根据类型,然后根据类型对吧,根据我们当前要赋值的属性的类型,对不对,好,然后在咱们的I。
07:46
C容器中去匹配某个并,哎去匹配,然后某个然后并对吧,然后为属性扶持,为属性赋值,哎,行,这个大家注意好,那当然呢,那咱们在这呢,大家看一下,那你说有没有一些特殊情况,当然这些特殊情况很少会出现,但是在这儿呢,咱们也给大家演示一下,就比如说我们当前呢,我们的IOC容器中,你根据类型你一个你都匹配不到,那这个时候会出现什么情况,大家看啊,比如说我们现在咱们把这下面这一疙瘩啊,我把这两个都给它注释掉,对不对,然后这个时候大家说我们的user control里面,你的user service,它根据类型能匹配成功吗?
08:32
匹配不匹配不成功,匹配不到任何一个病,对不对,好,那这个时候它会出现什么情况呢?我们现在来一个执行大家看啊。啊,你看他报的是什么,错报的还是空指针,我为什么在这儿给大家演示一下,因为我们一会儿要讲咱们基于注解的自动装配,大家注意基于注解的自动装配的时候也是by tap和by name。然后,而且他的by tap,如果你一个类型一个类型匹配的币你都找不到,在这跟他报的错是不一样的。
09:05
能看懂吧。好,这个大家一定要听好啊好,我们现在咱们在这所看到的错是什么?是空指针,那说明什么?那说明当我们设置了auto to well,然后等于by tap之后,然后它是不是应该是能匹配的,匹配匹配不到,然后就有默认值,大家说对不对。也就是说能匹配到,能根据类型匹配到某一个病,那咱们就为属性扶持,如果匹配不到,那就拉倒呗,那我就用我的默认值呗,大家说是不是,哎,这个大家看好啊好,那所以咱们在这来把它的。特殊情况来写一下,在这咱们写个注意。好,大家看好,然后弱看好啊,那其实就无非就两种特殊情况呗,一种就是根据类型,它一个都找不到,正常情况就是咱们能找到一个,然后呢,特殊情况就是我们当前根据类型,你要么一个都找不到,你要么一找就找到多个,对不对,大家看一下这个时候它都会报什么错啊,咱们最起码以后你看到这个错的,你也知道是什么问题,咱们也能够快速的去解决它啊啊大家看看,然后热咱们通过类型对吧,然后有啊在IOC通过类型,在啊通过类型,然后呢,没有找到,没有找到任何任何一个对吧?然后类型匹配的病好,然后此时大家注意啊,咱们的属性此时它就不装配,不装配是什么意思,跟咱们上面这是一样的,知道吧,然后这个属性它来使用的是默认。
10:43
认值OK吧,他会不会报错,其实它并没有报错,他报错是因为什么?是因为我们当前的属性使用了默认值,那然后所以才报了一个空指针,能看懂吧,行啊,那下面呢,我们再来看,那比如说我把这个注释给它取消掉,大家看好,这个时候咱们在这是不是有这样的一个B,然后在这呢,咱们的service的B有一个,Do的B有一个,对吧?那我们设置自动装备肯定没问题,那如果我在这儿我又设置了一个什么,我又设了一个B,它也是我们的user service I PL类型的,但是它的大家看好它的这个ID,咱们给它设置为service,看到没有,看到了吧,然后这个并咱们也是再给它复制一个,然后这个ID咱们给它设置为DAO,行啊,好,你看啊,他直接你看咱们当前咱们的配置文件就已经开始报错了。
11:38
为什么开始报错了呢?很简单,我根据类型现在匹配到了几个呀,俩,那大家告诉我,那现在它应该用哪一个呢?啊,大家想想还记不记得我们在获取B的时候,咱们讲过三种方式,当我通过类型来获取某个病的时候,咱们是不是要求IOC容器中有且只能有一个,对吧,类型匹配的B?
12:01
然后要不然咱们会报一个错,叫什么错,叫no unique病,DeFinition exception,没有一个唯一的病被发现异常,那这个时候大家说是不是也是呀,你看我们现在咱们在这有个病,你在这呢也有个病,然后现在有两个类型匹配的病,他到底应该用哪一个,他也不知道,那他不就傻了吗?那这个时候他就会干嘛,他就会给你报错,知道吧,现在我们来一个执行,大家来看啊,你看报的错是什么,对吧?咱们往下找啊,大家看好,咱们就找到这儿,你看报的错跟咱们之前看到的一样,不一样,叫no unique病,DeFinition exception,然后没有一个唯一的并被发现,是不是啊,然后我们当前咱们需要用到user service类型的对象,但是我们找到了几个,两个,一个叫user service,一个叫service,能看懂吧,好,所以说大家一定要看好,然后我们当前呢,然后咱们根据类型来获取的时候,其实它也是有个要求的,要求咱们的IOC容器中有且只有一个类型匹配的B。
13:07
然后能够为当前的属性扶持,OK吧,好在这咱们写一下啊好,然后B第二种情况,然后若通过类型对吧,咱们找到了什么,通过类型,然后咱们找到了。啊,找到了,然后多个。多个类型匹配的病,然后此时会超出异常,什么异常大家看好no unique b DeFinition interception,所以说咱们总结下来就是什么大家注意,然后当咱们使用by type,然后来实现自动装配时,自动装配时对吧?IOCIOC容器中啊有且只有有且只有一个类型匹配的B啊,能够为属性扶持,属性能够为属性扶持,这个大家注意啊,然后IOC容器中有且只有一个类型匹配的B,然后能够被属性扶持,要不然它就报错,知道不,你一个都没有它也不行,你有多个大家注意它也不行,OK吧,哎,行啊,好,那咱们以后大家说咱们说的这个,像咱们写的这种情况,我这里面有两个S。
14:27
会死的病,对吧?两个类型一样的病,这种情况我跟大家说过好多回了,咱们以后会经常出现这种问题吗?不会,我们一个类型的病在IOC容器中咱们只需要配置一次,OK吧,为什么?再说一遍,你默认就是单例的,你如果要通过配置多个类型,这个类型的多个B来获得一个不同的对象,你没必要这样去做,你只需要在B里面设置一个作用域,把它的作用域由单力设置为多力,你就可以获取一个新的对象了。所以说我们当前一个类型的病,你只需要配置一次。
15:02
知道吧,所以说我们以后用的比较多的啊,就是这个根据类型来进行自动装备,知道吧,因为该类型所对应的B在IOC容器中只会出现一次。好,这是我们当前自动装配的这个by tap方式啊好,下面呢,我们就来看一下这个by name方式。
我来说两句